/ Hex Artifact Content
Login

Artifact 0c58f7879b6439d2acd5c37b19c754873ffb9e5e:


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 37 32 20 32 30 30 39 2f 30  c,v 1.672 2009/0
0190: 37 2f 30 39 20 31 33 3a 32 35 3a 33 32 20 64 72  7/09 13:25:32 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
07c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
07d0: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
07e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
07f0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0800: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0810: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0820: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0830: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0840: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
0850: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0860: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0870: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0880: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0890: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08a0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08b0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08c0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08d0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08e0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08f0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0900: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0910: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0920: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0930: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0940: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0950: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0960: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0970: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0980: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0990: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09a0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
09f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a00: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a10: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a30: 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69  Locks(a).  #defi
0a40: 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  ne downgradeAllS
0a50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0a60: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0a70: 65 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  e hasSharedCache
0a80: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c  TableLock(a,b,c,
0a90: 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68  d) 1.  #define h
0aa0: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
0ab0: 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a  a, b) 0.#endif..
0ac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ad0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0ae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0af0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
0b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0b10: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0b20: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0b30: 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68 65 63  atement. It chec
0b40: 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 6e 65  ks.** that conne
0b50: 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20 74 68  ction p holds th
0b60: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
0b70: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
0b80: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62 2d 74  e to the .** b-t
0b90: 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ree with root pa
0ba0: 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73 6f 2c  ge iRoot. If so,
0bb0: 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
0bc0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  d. Otherwise, fa
0bd0: 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65 78 61  lse. .** For exa
0be0: 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69  mple, when writi
0bf0: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 2d  ng to a table b-
0c00: 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  tree with root-p
0c10: 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a  age iRoot via .*
0c20: 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69  * Btree connecti
0c30: 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  on pBtree:.**.**
0c40: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 53      assert( hasS
0c50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0c60: 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  ock(pBtree, iRoo
0c70: 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b  t, 0, WRITE_LOCK
0c80: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ) );.**.** When 
0c90: 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  writing to an in
0ca0: 64 65 78 20 62 2d 74 72 65 65 20 74 68 61 74 20  dex b-tree that 
0cb0: 72 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61  resides in a sha
0cc0: 72 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20  rable database, 
0cd0: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  the .** caller s
0ce0: 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74  hould have first
0cf0: 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b   obtained a lock
0d00: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20   specifying the 
0d10: 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
0d20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
0d30: 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  g table b-tree. 
0d40: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d50: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d60: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d80: 74 73 20 65 61 63 68 20 62 2d 74 72 65 65 20 61  ts each b-tree a
0d90: 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72  s a separate str
0da0: 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72  ucture. To deter
0db0: 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  mine.** the tabl
0dc0: 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65 73 70  e b-tree corresp
0dd0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
0de0: 64 65 78 20 62 2d 74 72 65 65 20 62 65 69 6e 67  dex b-tree being
0df0: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
0e00: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
0e10: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
0e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
0e30: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
0e40: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
0e50: 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
0e60: 65 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74  ed at page iRoot
0e70: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
0e80: 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65  .** hold a write
0e90: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
0ea0: 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20  ema table (root 
0eb0: 70 61 67 65 20 31 29 2e 20 54 68 69 73 20 69 73  page 1). This is
0ec0: 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61   also.** accepta
0ed0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0ee0: 6e 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68  nt hasSharedCach
0ef0: 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74  eTableLock(.  Bt
0f00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
0f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
0f20: 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f  hat must hold lo
0f30: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ck */.  Pgno iRo
0f40: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot,            /
0f50: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62  * Root page of b
0f60: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
0f70: 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  sIndex,         
0f80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f    /* True if iRo
0f90: 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f  ot is the root o
0fa0: 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  f an index b-tre
0fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b  e */.  int eLock
0fc0: 54 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Type          /*
0fd0: 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74   Required lock t
0fe0: 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  ype (READ_LOCK o
0ff0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f  r WRITE_LOCK) */
1000: 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  .){.  Schema *pS
1010: 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20  chema = (Schema 
1020: 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  *)pBtree->pBt->p
1030: 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69  Schema;.  Pgno i
1040: 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  Tab = 0;.  BtLoc
1050: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  k *pLock;..  /* 
1060: 49 66 20 74 68 69 73 20 62 2d 74 72 65 65 20 64  If this b-tree d
1070: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73  atabase is not s
1080: 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20  hareable, or if 
1090: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
10a0: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68  ading.  ** and h
10b0: 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  as the read-unco
10c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
10d0: 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69  , then no lock i
10e0: 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a  s required. .  *
10f0: 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1100: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   return true imm
1110: 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20 74 68  ediately.  If th
1120: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1130: 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77 72 69  ing .  ** or wri
1140: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
1150: 74 72 65 65 2c 20 62 75 74 20 74 68 65 20 73 63  tree, but the sc
1160: 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f 61 64  hema is not load
1170: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ed, then return.
1180: 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f 2e 20    ** true also. 
1190: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11a0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
11b0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 74 6f 6f  d, but it is too
11c0: 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a 2a 20   difficult.  ** 
11d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
11e0: 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  client actually 
11f0: 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73 20 64  holds it. This d
1200: 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20 76 65  oesn't happen ve
1210: 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e 20 20  ry.  ** often.  
1220: 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65 65  */.  if( (pBtree
1230: 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a 20  ->sharable==0). 
1240: 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65 3d    || (eLockType=
1250: 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28 70  =READ_LOCK && (p
1260: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1270: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1280: 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20 20 7c  committed)).   |
1290: 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20 28 21  | (isIndex && (!
12a0: 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68  pSchema || (pSch
12b0: 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63  ema->flags&DB_Sc
12c0: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 29  hemaLoaded)==0 )
12d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
12e0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
12f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1300: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1310: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
1320: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
1330: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
1340: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
1350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1360: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
1370: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1380: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1390: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
13a0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
13b0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
13c0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
13d0: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
13e0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
13f0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1400: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1410: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
1420: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
1430: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
1440: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
1450: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
1460: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
1470: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 52  ( pIdx->tnum==iR
1480: 6f 6f 74 20 29 7b 0a 09 69 54 61 62 20 3d 20 70  oot ){..iTab = p
1490: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
14a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
14b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
14c0: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
14d0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
14e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
14f0: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
1500: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
1510: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
1520: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
1530: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
1540: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
1550: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1560: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1570: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1580: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1590: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
15a0: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
15b0: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
15c0: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
15d0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
15e0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
15f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1600: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1610: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1620: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1630: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1640: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1650: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1660: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1670: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
16a0: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
16b0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
16c0: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
16d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
16f0: 73 6f 20 75 73 65 64 20 61 73 20 70 61 72 74 20  so used as part 
1700: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
1710: 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20  ements only. It 
1720: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
1730: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  one or more curs
1750: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1760: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
1770: 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74  oot page iRoot t
1780: 68 61 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e  hat do not belon
1790: 67 20 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e  g to either conn
17a0: 65 63 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a  ection pBtree .*
17b0: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
17c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
17d0: 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63  has the read-unc
17e0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
17f0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  t..**.** For exa
1800: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1810: 74 69 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f  ting to page iRo
1820: 6f 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ot:.**.**    ass
1830: 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
1840: 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20 69  flicts(pBtree, i
1850: 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  Root) );.*/.stat
1860: 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f  ic int hasReadCo
1870: 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70  nflicts(Btree *p
1880: 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f  Btree, Pgno iRoo
1890: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  p;.  for(p=pBtre
18b0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
18e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20  Root==iRoot .   
18f0: 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d    && p->pBtree!=
1900: 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20 30  pBtree.     && 0
1910: 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62  ==(p->pBtree->db
1920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1930: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1940: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1950: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1970: 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69  .#endif    /* #i
1980: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1990: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  G */../*.** Quer
19a0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
19b0: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
19c0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19d0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
19e0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
19f0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
1a00: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1a10: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
1a20: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
1a30: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
1a40: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
1a50: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
1a60: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a70: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
1a80: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
1aa0: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ab0: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
1ac0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
1ad0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
1ae0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1af0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1b00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b10: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b20: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1b30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1b40: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1b50: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1b60: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
1b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 70  );.  assert( !(p
1b80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1b90: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1ba0: 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  ed)||eLock==WRIT
1bb0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
1bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
1bd0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
1be0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
1bf0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
1c00: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
1c10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1c20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
1c30: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
1c40: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
1c50: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
1c60: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
1c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c80: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
1c90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ca0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1cb0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
1cc0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
1cd0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
1ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1cf0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1d00: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d10: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d20: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
1d30: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1d40: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1d50: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1d60: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1d70: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
1d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
1da0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1db0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
1dc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1dd0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
1de0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
1df0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
1e00: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
1e10: 69 74 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e  iter!=p && pBt->
1e20: 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1e30: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1e40: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1e50: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
1e60: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
1e70: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1e80: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
1e90: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1ea0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1eb0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1ec0: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
1ed0: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
1ee0: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
1ef0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f00: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
1f20: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
1f30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1f40: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
1f50: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1f60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f70: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
1f80: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
1f90: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
1fa0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
1fb0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1fc0: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
1fd0: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
1fe0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
1ff0: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2000: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2010: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
2020: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
2030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2040: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
2060: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
2070: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2080: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2090: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
20a0: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
20b0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
20c0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
20d0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
20e0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
20f0: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2100: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2110: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
2120: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
2130: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
2140: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
2150: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2160: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
2170: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2180: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2190: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
21a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21c0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
21d0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
21e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2200: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2210: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2230: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2240: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2250: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2260: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2270: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
2280: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
2290: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
22a0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
22b0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
22c0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
22d0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
22e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22f0: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2300: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2310: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2320: 65 64 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  ed b-tree connec
2330: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 69 73 20 63  tion handle is c
2340: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68  onnected to a sh
2350: 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20  arable.**       
2360: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
2370: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
2380: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 29  Shared.sharable)
2390: 20 66 6c 61 67 20 73 65 74 2c 20 61 6e 64 0a 2a   flag set, and.*
23a0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
23b0: 68 65 72 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  her b-tree conne
23c0: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 68 6f 6c  ction handle hol
23d0: 64 73 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ds a lock that c
23e0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
23f0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
2400: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
2410: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2420: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2430: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2440: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2450: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2460: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2470: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2480: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2490: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
24a0: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
24b0: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
24c0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
24d0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
24f0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2500: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2510: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
2520: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2530: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2540: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2550: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2560: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2570: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2580: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2590: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
25b0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
25c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
25d0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
25e0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
25f0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
2600: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
2610: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
2620: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2630: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2640: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2650: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2660: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2670: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2680: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2690: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
26a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
26b0: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
26c0: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
26d0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
26e0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
26f0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2700: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2710: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2720: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2730: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2750: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2760: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2770: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2780: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2790: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
27a0: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
27b0: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
27c0: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
27d0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
27e0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
27f0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2800: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2810: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2820: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2830: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2840: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2850: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2860: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2870: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2880: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2890: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
28a0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
28b0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
28c0: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
28d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
28e0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
28f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2900: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2910: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2920: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2930: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2940: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2950: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2960: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2970: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2980: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2990: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
29a0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
29b0: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
29c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
29d0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
29e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
29f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2a10: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2a20: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2a30: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2a40: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2a50: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2a60: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2a70: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2a80: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2a90: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2aa0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2ab0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2ac0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ad0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2ae0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2af0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2b00: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2b10: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2b20: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2b30: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2b40: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2b50: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2b60: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2b70: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2b80: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2b90: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2ba0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2bb0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2bd0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2be0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2bf0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2c00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2c10: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2c20: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
2c30: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
2c40: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
2c50: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
2c60: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2c70: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
2c80: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
2c90: 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20  handle p..**.** 
2ca0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2cb0: 73 75 6d 65 73 20 74 68 61 74 20 68 61 6e 64 6c  sumes that handl
2cc0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2cd0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2ce0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2cf0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2d00: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2d10: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2d20: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2d30: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2d40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2d50: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2d60: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2d70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2d80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2d90: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2da0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2db0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2dc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2dd0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2de0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2df0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2e00: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2e10: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2e20: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2e30: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2e40: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2e50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2e60: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2e70: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2e80: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2e90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ea0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2eb0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2ec0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ed0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
2ee0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
2ef0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
2f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f10: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
2f20: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
2f30: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
2f40: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
2f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f60: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
2f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f80: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
2f90: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
2fb0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
2fc0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
2fd0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
2fe0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
2ff0: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3000: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3010: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3020: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3030: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3040: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3050: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3060: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3070: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3080: 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  when connection 
3090: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
30a0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
30b0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
30c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
30d0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
30e0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
30f0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3100: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3110: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3120: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3130: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3140: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
3150: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
3160: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
3170: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
3180: 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61  he isPending fla
3190: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
31a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
31b0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
31c0: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
31d0: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
31e0: 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  g must.    ** be
31f0: 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53   zero already. S
3200: 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65  o this next line
3210: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20   is harmless in 
3220: 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
3230: 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  /.    pBt->isPen
3240: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ding = 0;.  }.}.
3250: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3260: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3270: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3280: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d by connection 
3290: 70 20 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  p to read-locks.
32a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32b0: 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
32c0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
32d0: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
32e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32f0: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
3300: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3310: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3320: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  k;.    pBt->pWri
3330: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3340: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
3350: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
3360: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66  nding = 0;.    f
3370: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c  or(pLock=pBt->pL
3380: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
3390: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
33a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Lock->eLock==REA
33c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
33d0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20  >pBtree==p );.  
33e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
33f0: 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
3400: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69    }.  }.}..#endi
3410: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3420: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3430: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
3440: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
3450: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
3460: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3470: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
3480: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3490: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
34a0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
34b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
34c0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
34d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
34e0: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
34f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3500: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3510: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3520: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3530: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3540: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3550: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3560: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3570: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3580: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3590: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
35a0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
35b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
35c0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
35d0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
35e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
35f0: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3600: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3610: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3620: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3630: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3640: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3650: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3660: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3670: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3680: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3690: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
36a0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
36b0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
36c0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
36d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3700: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3710: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3720: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3730: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3740: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3760: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3770: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3780: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3790: 65 0a 2a 2a 20 62 2d 74 72 65 65 20 74 6f 20 69  e.** b-tree to i
37a0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
37b0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
37c0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
37d0: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
37e0: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
37f0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 41 72  ing modified. Ar
3800: 67 75 6d 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20  gument pgnoRoot 
3810: 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d  is the .** root-
3820: 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c  page of the tabl
3830: 65 20 62 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a  e b-tree. .**.**
3840: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3850: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3860: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3870: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3890: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
38a0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
38b0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
38c0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
38d0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
38e0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
38f0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3900: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3910: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3920: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3930: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3940: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3950: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3960: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3970: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3990: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
39a0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
39b0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
39c0: 68 69 73 20 73 70 65 63 69 66 69 63 20 72 6f 77  his specific row
39d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
39e0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
39f0: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
3a00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
3a10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
3a20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
3a30: 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
3a40: 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
3a50: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61   /* Look for rea
3a60: 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69  d cursors on thi
3a70: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 36 34  s btree */.  i64
3a80: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3aa0: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3ab0: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3ac0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ae0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3af0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3b00: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3b10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3b20: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3b30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b40: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3b50: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3b60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3b70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3b80: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3b90: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3ba0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3bb0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3bc0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3bd0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3be0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3bf0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3c00: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3c10: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3c20: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3c30: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3c40: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3c50: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3c60: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77  ncrblobCursors(w
3c70: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
3c80: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
3c90: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
3ca0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
3cb0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
3cc0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
3cd0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
3ce0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
3cf0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
3d00: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
3d10: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
3d20: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
3d30: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
3d40: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
3d50: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
3d60: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
3d70: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
3d80: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
3d90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
3da0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
3db0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3dc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
3dd0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
3de0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
3df0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
3e00: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
3e10: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
3e20: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
3e30: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
3e40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
3e50: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
3e60: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
3e70: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
3e80: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
3e90: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
3ea0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
3eb0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
3ec0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
3ed0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
3ee0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
3ef0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
3f00: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
3f10: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
3f20: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
3f30: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
3f40: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
3f50: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
3f60: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
3f70: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3f80: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
3f90: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
3fa0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
3fb0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
3fc0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
3fd0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
3fe0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
3ff0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4000: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4010: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4020: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4030: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4040: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4050: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4060: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4070: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4080: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4090: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
40a0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
40b0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
40c0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
40d0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
40e0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
40f0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4100: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4110: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4120: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4130: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4140: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4150: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4160: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4170: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4180: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4190: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
41a0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
41b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
41c0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
41d0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
41e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
41f0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4200: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4210: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4220: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4230: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4240: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4250: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4260: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4270: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4280: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4290: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
42a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
42b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
42c0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
42d0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
42e0: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
42f0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4300: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4310: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4320: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4330: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4340: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4350: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4360: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4380: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4390: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
43a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
43b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
43c0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
43d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
43e0: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
43f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
4400: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
4410: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
4420: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
4430: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4440: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4450: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4460: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
4470: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
4480: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4490: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
44a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
44b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
44c0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
44d0: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
44e0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
44f0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4500: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
4510: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
4520: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4530: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
4540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4550: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
4560: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4570: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
4580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4590: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
45a0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
45b0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
45c0: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
45d0: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
45e0: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
45f0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
4600: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
4610: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
4620: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
4630: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
4640: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
4650: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4660: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
4670: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4680: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4690: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
46a0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
46b0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
46c0: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
46d0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
46e0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
46f0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
4700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
4710: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
4720: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4730: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4740: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
4750: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
4760: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
4770: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4780: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4790: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
47a0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
47b0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
47c0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
47e0: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
47f0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
4800: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
4810: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
4820: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
4830: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
4840: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
4850: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
4860: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
4870: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
4880: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
4890: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
48a0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
48b0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
48c0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
48d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
48e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
48f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4900: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4910: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4920: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4940: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4950: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
4960: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
4970: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
4980: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
4990: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
49a0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
49b0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
49c0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
49d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
49e0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
49f0: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
4a00: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
4a10: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
4a20: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
4a30: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
4a40: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
4a50: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
4a60: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
4a70: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
4a80: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
4a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4aa0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
4ab0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
4ac0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
4ad0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
4ae0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
4af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
4b00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
4b10: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
4b20: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
4b30: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
4b40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4b50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4b60: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
4b70: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
4b80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b90: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
4ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4bb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4bc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4bd0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
4be0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4bf0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
4c00: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
4c10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4c20: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
4c40: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
4c50: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
4c60: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
4c70: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
4c80: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4c90: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
4ca0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
4cb0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4cc0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
4cd0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
4ce0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4cf0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
4d00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
4d10: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
4d20: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
4d30: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
4d40: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
4d50: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
4d60: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
4d70: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
4d80: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
4d90: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
4da0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
4db0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
4dc0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
4dd0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
4df0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
4e00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
4e10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
4e20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
4e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
4e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
4e60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4e70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
4e80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
4e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
4ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
4eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
4ec0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
4ed0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
4ee0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
4ef0: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
4f00: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f10: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
4f20: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
4f30: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
4f40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
4f50: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
4f60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
4f70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
4fa0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
4fb0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
4fc0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
4fd0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
4fe0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
4ff0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5000: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5010: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5020: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5030: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5040: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5050: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5060: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5070: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5080: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5090: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
50a0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
50b0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
50c0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
50d0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
50e0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
50f0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
5100: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
5110: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
5120: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
5130: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
5140: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
5150: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
5160: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
5170: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
5180: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
5190: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
51a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
51b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
51c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
51e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
51f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
5200: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
5210: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
5220: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
5230: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
5240: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
5250: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
5260: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
5270: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
5280: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
52b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
52c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
52d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
52e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
52f0: 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20  aSpace[150];    
5300: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
5310: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
5320: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
5330: 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b  loc */..  if( pK
5340: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5350: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5360: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5370: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5380: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5390: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
53a0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
53b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
53e0: 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
53f0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
5400: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5410: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
5420: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5430: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
5440: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
5450: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
5460: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
5470: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
5480: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
5490: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
54a0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
54b0: 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
54c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
54d0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
54e0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
54f0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
5500: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
5510: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
5520: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
5530: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
5540: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
5550: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
5560: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
5570: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
5580: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
5590: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
55a0: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
55b0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
55c0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
55d0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
55e0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
55f0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
5600: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  tion()..*/.stati
5610: 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f  c int btreeResto
5620: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5630: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5640: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
5650: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5660: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5670: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
5680: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5690: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
56a0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
56b0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
56c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
56d0: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
56e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
56f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5700: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
5710: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5720: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5730: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
5740: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5750: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5760: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5770: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5780: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5790: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
57a0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
57b0: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
57c0: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
57d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
57e0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
57f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5800: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
5810: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5820: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
5830: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
5840: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5850: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
5860: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
5870: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
5880: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5890: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
58a0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
58b0: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
58c0: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
58d0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
58e0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
58f0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
5900: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
5910: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
5920: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
5930: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
5940: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
5950: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
5960: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
5970: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
5980: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
5990: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
59a0: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
59b0: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
59c0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
59d0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
59e0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
59f0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
5a00: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
5a10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5a20: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
5a30: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
5a40: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
5a50: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
5a60: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
5a70: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
5a80: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
5a90: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5aa0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
5ab0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
5ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ad0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
5ae0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5af0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
5b00: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
5b10: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
5b20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
5b30: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
5b40: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
5b50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
5b60: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
5b70: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
5b80: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
5b90: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
5ba0: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
5bb0: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
5bc0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
5bd0: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
5be0: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
5bf0: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
5c00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5c10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5c20: 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65  utex) );.  nPage
5c30: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
5c40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
5c50: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
5c60: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
5c70: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
5c80: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
5c90: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
5ca0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
5cb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
5cc0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
5cd0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
5ce0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
5cf0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
5d00: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
5d10: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
5d20: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
5d30: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
5d40: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
5d50: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
5d60: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
5d70: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
5d80: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
5d90: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
5da0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
5db0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
5dc0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5dd0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
5de0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
5df0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
5e00: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5e10: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
5e20: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
5e30: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
5e40: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
5e50: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
5e60: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
5e70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
5e80: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
5e90: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
5ea0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
5eb0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
5ec0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
5ed0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
5ee0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
5ef0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
5f00: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
5f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5f20: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5f30: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
5f40: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
5f50: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
5f60: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
5f70: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
5f80: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
5f90: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
5fa0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
5fb0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
5fc0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
5fd0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
5fe0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72   key==0 ){.    r
5ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6000: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6010: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6020: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6030: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6040: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6050: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6060: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
6090: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
60a0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
60b0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
60c0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
60d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
60e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
60f0: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6100: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74  _exit;.  }.  pPt
6110: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6120: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6130: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
6140: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
6150: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
6160: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6170: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
6180: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
6190: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
61a0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
61b0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
61c0: 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t));.    rc = sq
61d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
61e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
61f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6200: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6210: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6220: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6230: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6240: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6250: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6260: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6270: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6280: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
6290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
62a0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
62b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
62c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
62d0: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
62e0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
62f0: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6300: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6310: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6320: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6330: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6340: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6350: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
6360: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6370: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
6380: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
6390: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
63a0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
63b0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
63c0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
63d0: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
63e0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
63f0: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6400: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6410: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6420: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6430: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6440: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6450: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
6460: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
6470: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
6480: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
6490: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
64a0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
64b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
64c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
64d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
64e0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
64f0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6500: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6520: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6530: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6540: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6550: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6560: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6570: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6580: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6590: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
65a0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
65b0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
65c0: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
65d0: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
65e0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
65f0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
6600: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
6610: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
6620: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
6630: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
6640: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
6650: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
6660: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
6670: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6680: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
6690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
66a0: 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69  #else /* if defi
66b0: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned SQLITE_OMIT_
66c0: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20  AUTOVACUUM */.  
66d0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
66e0: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
66f0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
6700: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
6710: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
6720: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
6730: 76 66 6c 50 74 72 28 78 2c 20 79 29 20 53 51 4c  vflPtr(x, y) SQL
6740: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
6750: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
6760: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
6770: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
6780: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
6790: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
67a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
67b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
67c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
67d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
67e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
67f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6800: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
6810: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
6820: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
6830: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6840: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
6850: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
6860: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
6870: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
6880: 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50  e(&(P)->aData[(P
6890: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
68a0: 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (I)])))../*.** T
68b0: 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  his a more compl
68c0: 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69  ex version of fi
68d0: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
68e0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
68f0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
6900: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6910: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66  .*/.static u8 *f
6920: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
6930: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6940: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e  int iCell){.  in
6950: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t i;.  assert( s
6960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6980: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  tex) );.  for(i=
6990: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
69a0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
69b0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
69c0: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
69d0: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
69e0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
69f0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
6a00: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
6a10: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
6a20: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
6a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6a40: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
6a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6a60: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
6a70: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
6a80: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
6a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
6aa0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
6ab0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
6ac0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
6ad0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
6ae0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
6af0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
6b00: 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61  nction.  btreePa
6b10: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
6b20: 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78  a .** cell index
6b30: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
6b40: 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65  rgument and btre
6b50: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
6b60: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
6b70: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
6b80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
6b90: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
6ba0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
6bb0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
6bc0: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
6bd0: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
6be0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74  instead of.** bt
6bf0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6c00: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
6c10: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
6c20: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
6c30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
6c40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
6c50: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
6c60: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
6c70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
6c80: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
6c90: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
6ca0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
6cb0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
6cc0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
6cd0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
6ce0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
6cf0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
6d00: 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  16 n;           
6d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6d20: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
6d30: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
6d40: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
6d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6d60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6d70: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
6d80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6d90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6da0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6db0: 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70  ) );..  pInfo->p
6dc0: 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
6dd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
6de0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
6df0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20  >leaf==1 );.  n 
6e00: 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
6e10: 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  rSize;.  assert(
6e20: 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c   n==4-4*pPage->l
6e30: 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61  eaf );.  if( pPa
6e40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
6e50: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
6e60: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20  Data ){.      n 
6e70: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
6e80: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
6e90: 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ad);.    }else{.
6ea0: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
6eb0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   0;.    }.    n 
6ec0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43  += getVarint(&pC
6ed0: 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70  ell[n], (u64*)&p
6ee0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  Info->nKey);.   
6ef0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
6f00: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
6f10: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44  e{.    pInfo->nD
6f20: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b  ata = 0;.    n +
6f30: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
6f40: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
6f50: 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  d);.    pInfo->n
6f60: 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  Key = nPayload;.
6f70: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
6f80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
6f90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
6fa0: 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61  er = n;.  testca
6fb0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
6fc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
6fd0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
6fe0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
6ff0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
7000: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
7010: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
7020: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
7030: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
7040: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7050: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
7060: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
7070: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
7080: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
7090: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
70a0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
70b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
70c0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
70d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
70e0: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
70f0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
7100: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
7110: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
7120: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7130: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7140: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
7150: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
7160: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
7170: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
7180: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
7190: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
71a0: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
71b0: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
71c0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
71d0: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
71e0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
71f0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
7200: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
7210: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
7220: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
7230: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
7240: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
7250: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
7260: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
7270: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
7280: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
7290: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
72a0: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
72b0: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
72c0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
72d0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
72e0: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
72f0: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
7300: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
7310: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
7320: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
7330: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
7340: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
7350: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
7360: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
7370: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
7380: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
7390: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
73a0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
73b0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
73c0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
73d0: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
73e0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
73f0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
7400: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
7410: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
7420: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
7430: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
7440: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
7450: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
7460: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
7470: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
7480: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
7490: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
74a0: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
74b0: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
74c0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
74d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
74e0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
74f0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7500: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
7510: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7520: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  s==maxLocal+1 );
7530: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
7540: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
7550: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7560: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
7570: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
7580: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
7590: 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63  al = (u16)minLoc
75a0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
75b0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
75c0: 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c   (u16)(pInfo->nL
75d0: 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70  ocal + n);.    p
75e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
75f0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
7600: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
7610: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
7620: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7630: 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43   \.  btreeParseC
7640: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
7650: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
7660: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
7670: 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64  fo)).static void
7680: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7690: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
76a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
76b0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
76c0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
76d0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
76e0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
76f0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
7700: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
7710: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7720: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7730: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7740: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
7750: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
7760: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
7770: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
7780: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
7790: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
77a0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
77b0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
77c0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
77d0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
77e0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
77f0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
7800: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
7810: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
7820: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
7830: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
7840: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
7850: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
7860: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
7870: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
7880: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7890: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
78a0: 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d   = &pCell[pPage-
78b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
78c0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69    u32 nSize;..#i
78d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
78e0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
78f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7900: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7910: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
7920: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
7930: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
7940: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
7950: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
7960: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
7970: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
7980: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
7990: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
79a0: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
79b0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
79c0: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
79d0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
79e0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
79f0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
7a00: 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65  buginfo;.  btree
7a10: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
7a20: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
7a30: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
7a40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7a50: 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  Key ){.    u8 *p
7a60: 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61  End;.    if( pPa
7a70: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7a80: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
7a90: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
7aa0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c   nSize);.    }el
7ab0: 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  se{.      nSize 
7ac0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
7ad0: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
7ae0: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
7af0: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
7b00: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
7b10: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
7b20: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
7b30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
7b40: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
7b50: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
7b60: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
7b70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
7b80: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
7b90: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
7ba0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
7bb0: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
7bc0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
7bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
7be0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7bf0: 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20  pIter, nSize);. 
7c00: 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20   }..  testcase( 
7c10: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7c20: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
7c30: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7c40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
7c50: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50  ;.  if( nSize>pP
7c60: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7c70: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
7c80: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7c90: 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  cal;.    nSize =
7ca0: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69   minLocal + (nSi
7cb0: 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25  ze - minLocal) %
7cc0: 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
7cd0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
7ce0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
7cf0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7d00: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7d10: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d20: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7d30: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  .    if( nSize>p
7d40: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7d50: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
7d60: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
7d70: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a      nSize += 4;.
7d80: 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28    }.  nSize += (
7d90: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
7da0: 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  ll);..  /* The m
7db0: 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  inimum size of a
7dc0: 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74  ny cell is 4 byt
7dd0: 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69  es. */.  if( nSi
7de0: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a  ze<4 ){.    nSiz
7df0: 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73  e = 4;.  }..  as
7e00: 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62  sert( nSize==deb
7e10: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  uginfo.nSize );.
7e20: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
7e30: 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e  ize;.}.#ifndef N
7e40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
7e50: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
7e60: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
7e70: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  ell){.  return c
7e80: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
7e90: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
7ea0: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
7eb0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
7ec0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7ed0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
7ee0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
7ef0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
7f00: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
7f10: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
7f20: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
7f30: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
7f50: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
7f60: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
7f70: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
7f80: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
7f90: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7fa0: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
7fb0: 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  info;.  assert( 
7fc0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74  pCell!=0 );.  bt
7fd0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7fe0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
7ff0: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
8000: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
8010: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
8020: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
8030: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
8040: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
8050: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
8060: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
8070: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
8080: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
8090: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
80a0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
80b0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
80c0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
80d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
80e0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  OK;.}.#endif.../
80f0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8100: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
8110: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
8120: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
8130: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8140: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8150: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8160: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8170: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8180: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8190: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
81a0: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
81b0: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
81c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
81d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
81e0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
81f0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8200: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8220: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
8230: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8240: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8250: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8260: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8290: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
82a0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
82d0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
82e0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
82f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8300: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
8310: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
8320: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
8330: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8340: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8350: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8360: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8380: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8390: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
83a0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
83d0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
83e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
83f0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8400: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
8410: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8420: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
8430: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8440: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8450: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8470: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8480: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8490: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
84b0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
84c0: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
84d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
84e0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
84f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8500: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8510: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8520: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8530: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8540: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8550: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8560: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8570: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8580: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8590: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
85a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
85b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
85c0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
85d0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
85e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
85f0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8600: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8610: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8620: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8630: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8640: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8650: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8660: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8670: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8680: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8690: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
86a0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
86b0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
86c0: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
86d0: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
86e0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
86f0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8700: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8710: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8720: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8730: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8740: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8750: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8760: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8770: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8780: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8790: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
87a0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
87b0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
87c0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
87d0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
87e0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
87f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8800: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8810: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8830: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8840: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8850: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8860: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8870: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8880: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
88a0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
88b0: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
88c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
88d0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
88e0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
88f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8900: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8910: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8920: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8930: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8940: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8950: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8960: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8970: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8980: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
89a0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
89b0: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
89c0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
89d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
89e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
89f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8a00: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8a10: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8a20: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8a30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8a40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8a50: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8a60: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8a70: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8a80: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8a90: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8aa0: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8ab0: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8ac0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8ad0: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8ae0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8af0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8b00: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8b10: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8b20: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8b30: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8b40: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8b50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8b60: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8b70: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8b80: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8b90: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8ba0: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8bb0: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8bc0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8bd0: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8be0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8bf0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8c00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8c10: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8c20: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8c30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8c40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8c50: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8c60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8c70: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8c80: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8c90: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8ca0: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8cb0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8cc0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8cd0: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8ce0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8cf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8d00: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8d10: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8d20: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8d30: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8d40: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8d50: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8d60: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
8d70: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
8d80: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
8d90: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
8da0: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
8db0: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
8dc0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
8dd0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
8de0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
8df0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
8e00: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
8e10: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
8e20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
8e30: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
8e40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
8e50: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
8e60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
8e70: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
8e80: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
8e90: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
8ea0: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
8eb0: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
8ec0: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
8ed0: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
8ee0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
8ef0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
8f00: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
8f10: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
8f20: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
8f30: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
8f40: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
8f50: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
8f60: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
8f70: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
8f80: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
8f90: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
8fa0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
8fb0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
8fc0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
8fd0: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9000: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
9010: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
9020: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9050: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9060: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9070: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9080: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9090: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
90a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
90b0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
90c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
90d0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
90e0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 0a  turn code */.  .
90f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9100: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9110: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9130: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9140: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9150: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9160: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9170: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9180: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9190: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
91a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
91b0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
91c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
91d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
91e0: 3d 30 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  =0 );..  nFrag =
91f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
9200: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9210: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9220: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9230: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9240: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9250: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9260: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
9270: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9280: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
9290: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
92a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
92b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
92c0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
92d0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
92e0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
92f0: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9300: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9310: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9320: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9330: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9340: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9350: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
9360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
9370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9380: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
9390: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
93a0: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
93b0: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
93c0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
93d0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
93e0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
93f0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
9400: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
9410: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
9420: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
9430: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
9440: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9450: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9460: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9470: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9480: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9490: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
94a0: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
94b0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
94c0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
94d0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
94e0: 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
94f0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9500: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9510: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
9520: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
9530: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
9540: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
9550: 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  te;.        test
9560: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
9570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9580: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20  x==3 );.        
9590: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
95a0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
95b0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
95c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
95d0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
95e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
95f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
9600: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
9610: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
9620: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
9630: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
9640: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
9650: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
9660: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
9670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9680: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
9690: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
96a0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
96b0: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
96c0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
96d0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
96e0: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
96f0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
9700: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
9710: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
9720: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9730: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
9740: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
9750: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9770: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
9780: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  make sure there 
9790: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
97a0: 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61  in the gap to sa
97b0: 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61  tisfy.  ** the a
97c0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e  llocation.  If n
97d0: 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a  ot, defragment..
97e0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
97f0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
9800: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
9810: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
9820: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9830: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9840: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9850: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9860: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
9870: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
9880: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
9890: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
98a0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
98b0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
98c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
98d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
98e0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
98f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
9900: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
9910: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
9920: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
9930: 70 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f  p);.  *pIdx = to
9940: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
9950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9960: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
9970: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
9980: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
9990: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
99a0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
99b0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
99c0: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
99d0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
99e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
99f0: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
9a00: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
9a10: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
9a20: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
9a30: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
9a40: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
9a50: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
9a60: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
9a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
9a80: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
9a90: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
9aa0: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
9ab0: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
9ac0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
9ad0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
9af0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
9b00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
9b10: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9b20: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
9b30: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
9b40: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
9b50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
9b60: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9b70: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9b80: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9b90: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
9ba0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
9bb0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
9bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
9bd0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
9be0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9bf0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
9c00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9c10: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9c20: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9c30: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
9c40: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9c50: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
9c60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
9c70: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
9c80: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
9c90: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
9ca0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
9cb0: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
9cc0: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
9cd0: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
9ce0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
9cf0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
9d00: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
9d10: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
9d20: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
9d30: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9d40: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   of freeblocks. 
9d50: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
9d60: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
9d70: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
9d80: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
9d90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20  reeInitPage(),. 
9da0: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
9db0: 65 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65  e() did not dete
9dc0: 63 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63  ct overlapping c
9dd0: 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65  ells or.  ** fre
9de0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65  eblocks that ove
9df0: 72 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20  rlapped cells.  
9e00: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74   Nor does it det
9e10: 65 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ect when the.  *
9e20: 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  * cell content a
9e30: 72 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20  rea exceeds the 
9e40: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67  value in the pag
9e50: 65 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68  e header.  If th
9e60: 65 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69  ese.  ** situati
9e70: 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20  ons arise, then 
9e80: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72  subsequent inser
9e90: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67  t operations mig
9ea0: 68 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20  ht corrupt.  ** 
9eb0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53  the freelist.  S
9ec0: 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20  o we do need to 
9ed0: 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70  check for corrup
9ee0: 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e  tion while scann
9ef0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  ing.  ** the fre
9f00: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64  elist..  */.  hd
9f10: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
9f20: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
9f30: 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20  dr + 1;.  iLast 
9f40: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
9f50: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
9f60: 61 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69  assert( start<=i
9f70: 4c 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28  Last );.  while(
9f80: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
9f90: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9fa0: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
9fb0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n>0 ){.    if( p
9fc0: 62 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a  begin<addr+4 ){.
9fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9fe0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
a000: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
a010: 20 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73   if( pbegin>iLas
a020: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
a030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a040: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
a050: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
a060: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
a070: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a080: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
a090: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a0a0: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
a0b0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
a0c0: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
a0d0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
a0e0: 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  e = pPage->nFree
a0f0: 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20   + (u16)size;.. 
a100: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
a110: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
a120: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64  s */.  addr = hd
a130: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
a140: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a150: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a160: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
a170: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
a180: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
a190: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
a1a0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
a1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a1c0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
a1d0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
a1e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
a1f0: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
a200: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
a210: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
a220: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
a230: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
a240: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
a250: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
a260: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
a270: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
a280: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
a290: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29  t)data[hdr+7]) )
a2a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a2b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a2c0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
a2d0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
a2e0: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
a2f0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
a300: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
a310: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a320: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
a330: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
a340: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
a350: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
a360: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
a370: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a380: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
a390: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
a3a0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
a3b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a3c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a3d0: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
a3e0: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
a3f0: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
a400: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
a410: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
a420: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
a430: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
a440: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
a450: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a460: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
a470: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
a480: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
a490: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
a4a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a4b0: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
a4c0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
a4d0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
a4e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
a4f0: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
a500: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a510: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a520: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
a550: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
a560: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
a570: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
a580: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
a590: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
a5a0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
a5b0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
a5c0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
a5d0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
a5e0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
a5f0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
a600: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
a610: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
a620: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
a630: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
a640: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a650: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
a660: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
a670: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
a680: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
a690: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
a6a0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
a6b0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
a6c0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
a6d0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
a6e0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
a6f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
a700: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
a710: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
a720: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
a730: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
a740: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a750: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
a760: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
a770: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a780: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
a790: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
a7a0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
a7b0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
a7c0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
a7d0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
a7e0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
a7f0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
a800: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a810: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
a820: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
a830: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
a840: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
a850: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a860: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
a870: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
a880: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
a890: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
a8a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
a8b0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
a8c0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
a8d0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
a8e0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
a8f0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
a900: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
a910: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
a920: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
a930: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
a940: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
a950: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
a960: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
a970: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
a980: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
a990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a9a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a9b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
a9c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
a9e0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
a9f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
aa00: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
aa10: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
aa20: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
aa30: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
aa40: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
aa50: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
aa60: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
aa70: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
aa80: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
aa90: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
aaa0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
aab0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
aac0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
aad0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
aae0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
aaf0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
ab00: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
ab10: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
ab20: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
ab30: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
ab40: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ab50: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
ab60: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ab70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ab80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ab90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
aba0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
abb0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
abc0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
abd0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
abe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
abf0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ac00: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ac10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ac20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ac30: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
ac40: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ac50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ac60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
ac70: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
ac80: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
ac90: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
aca0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
acb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
acc0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ace0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
acf0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
ad00: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
ad10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
ad20: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ad30: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ad40: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ad50: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ad60: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ad70: 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a     u16 usableSiz
ad80: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ad90: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ada0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
adb0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
adc0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
add0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ade0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
adf0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ae00: 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20   u16 nFree;     
ae10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae20: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ae30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ae40: 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20   u16 top;       
ae50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae60: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ae70: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ae80: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ae90: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
aea0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
aeb0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
aec0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
aed0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
aee0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
aef0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
af00: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
af10: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
af20: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
af30: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
af40: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
af50: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
af60: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
af70: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
af80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
afa0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
afb0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
afc0: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
afd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
afe0: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
aff0: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20  geSize - 1;.    
b000: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b010: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
b020: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
b030: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
b040: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
b050: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
b060: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
b070: 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d  >leaf;.    top =
b080: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b090: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
b0a0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
b0b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
b0c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
b0d0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
b0e0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
b0f0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
b100: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
b110: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
b120: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
b130: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b140: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
b160: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
b170: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
b180: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
b190: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
b1a0: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
b1b0: 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70 61  e use to read pa
b1c0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
b1d0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
b1e0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
b1f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
b200: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
b210: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
b220: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
b230: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
b240: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
b250: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
b260: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
b270: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
b280: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
b290: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
b2a0: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
b2b0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
b2c0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
b2d0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
b2e0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b2f0: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
b300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b310: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
b320: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
b330: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
b340: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
b350: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
b360: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
b370: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
b380: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b390: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
b3a0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b3b0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
b3c0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
b3d0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
b3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b3f0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
b400: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
b410: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
b420: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
b430: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
b440: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b450: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b460: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b470: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b480: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b4b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4c0: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
b4d0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
b4e0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
b4f0: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
b500: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b510: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
b520: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b530: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b540: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b550: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
b560: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
b570: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b580: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
b590: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
b5a0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
b5b0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
b5c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
b5d0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
b5e0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
b5f0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
b600: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
b610: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
b620: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
b630: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
b640: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b650: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b660: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
b670: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
b680: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
b690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b6a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
b6c0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b6d0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
b6e0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b6f0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
b700: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
b710: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
b720: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
b730: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
b740: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
b750: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
b760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b770: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
b780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
b790: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
b7a0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
b7b0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
b7c0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
b7d0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
b7e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
b7f0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
b800: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
b810: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
b820: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
b830: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
b840: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
b850: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
b860: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
b870: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
b880: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
b890: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
b8a0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
b8b0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
b8c0: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
b8d0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
b8e0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
b8f0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
b900: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
b910: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
b920: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
b930: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
b940: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
b950: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
b960: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
b970: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b990: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b9a0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
b9b0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
b9c0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 3b 0a  e - iCellFirst;.
b9d0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
b9e0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
b9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
ba10: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
ba20: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
ba30: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
ba40: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
ba50: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
ba60: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
ba70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ba80: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
ba90: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
baa0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
bab0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bac0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
bad0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
bae0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
baf0: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
bb00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
bb10: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
bb20: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
bb30: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
bb40: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
bb50: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
bb60: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
bb70: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
bb80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bb90: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
bba0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
bbb0: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
bbc0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
bbd0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
bbe0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
bbf0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bc00: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
bc10: 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65  ex) );.  /*memse
bc20: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
bc30: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bc40: 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74   - hdr);*/.  dat
bc50: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
bc60: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
bc70: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
bc80: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
bc90: 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74   ?1:0);.  memset
bca0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
bcb0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
bcc0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
bcd0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
bce0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
bcf0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
bd00: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
bd10: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
bd20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
bd30: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
bd40: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
bd50: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
bd60: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
bd70: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
bd80: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
bd90: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
bda0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
bdb0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
bdc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
bdd0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
bde0: 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65  ize - 1;.  pPage
bdf0: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
be00: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
be10: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
be20: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
be30: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
be40: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
be50: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
be60: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
be70: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
be80: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
be90: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
bea0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
beb0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
bec0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
bed0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
bee0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
bef0: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
bf00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
bf10: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
bf20: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
bf30: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
bf40: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
bf50: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
bf60: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
bf70: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
bf80: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
bf90: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
bfa0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
bfb0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
bfc0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
bfd0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
bfe0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
bff0: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
c000: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
c010: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
c020: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
c030: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
c040: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
c050: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
c060: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
c070: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
c080: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
c090: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
c0a0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
c0b0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
c0c0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
c0d0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
c0e0: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
c0f0: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
c100: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
c110: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
c120: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
c130: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
c140: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
c150: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
c160: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
c170: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
c180: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
c190: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
c1a0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
c1b0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
c1c0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
c1d0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
c1e0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
c1f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c200: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
c210: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
c220: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
c230: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
c240: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
c250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
c260: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
c270: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
c280: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
c290: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c2a0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
c2b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c2c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c2d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c2e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c2f0: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
c300: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
c310: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
c320: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
c330: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c340: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
c350: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
c360: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
c370: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
c380: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c390: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
c3a0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
c3b0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
c3c0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
c3d0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
c3e0: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
c3f0: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
c400: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
c410: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
c420: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
c430: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
c440: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
c450: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c460: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
c470: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
c480: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
c490: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
c4a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c4b0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
c4c0: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
c4d0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
c4e0: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
c4f0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
c500: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
c510: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
c520: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
c530: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
c540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c550: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c560: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
c570: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
c580: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
c590: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
c5a0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
c5b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
c5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
c5d0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42  pagerPagecount(B
c5e0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
c5f0: 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b   int nPage = -1;
c600: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
c610: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
c620: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
c630: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
c640: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
c650: 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
c660: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
c670: 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20  | nPage==-1 );. 
c680: 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50   return (Pgno)nP
c690: 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  age;.}../*.** Ge
c6a0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c6b0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
c6c0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
c6d0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
c6e0: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
c6f0: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
c700: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
c710: 74 6f 0a 2a 2a 20 62 74 72 65 65 47 65 74 50 61  to.** btreeGetPa
c720: 67 65 28 29 20 61 6e 64 20 62 74 72 65 65 49 6e  ge() and btreeIn
c730: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
c740: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
c750: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
c760: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
c770: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
c780: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
c790: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
c7a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
c7b0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
c7c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
c7d0: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
c7e0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
c7f0: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
c800: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
c810: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
c820: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c830: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c840: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c870: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f  _BKPT; .  }..  /
c880: 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68  * It is often th
c890: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
c8a0: 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20  page we want is 
c8b0: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
c8c0: 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65  ..  ** If so, ge
c8d0: 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20  t it directly.  
c8e0: 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72  This saves us fr
c8f0: 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c  om having to cal
c900: 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65  l.  ** pagerPage
c910: 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20  count() to make 
c920: 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74  sure pgno is wit
c930: 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63  hin limits, whic
c940: 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  h results.  ** i
c950: 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  n a measureable 
c960: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
c970: 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  ovements..  */. 
c980: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
c990: 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
c9a0: 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20  up(pBt, pgno);. 
c9b0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
c9c0: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
c9d0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
c9e0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c9f0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
ca00: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
ca10: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
ca20: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 74 65 73 74   it. */.    test
ca30: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 70 61 67 65  case( pgno==page
ca40: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
ca50: 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
ca60: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
ca70: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Bt) ){.      ret
ca80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ca90: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
caa0: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
cab0: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
cac0: 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
cad0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cae0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d   rc;.    pPage =
caf0: 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20   *ppPage;.  }.  
cb00: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
cb10: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  it ){.    rc = b
cb20: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
cb30: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
cb40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cb50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cb60: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
cb70: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
cb80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cb90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
cba0: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
cbb0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
cbc0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
cbd0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
cbe0: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
cbf0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
cc00: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
cc10: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
cc20: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
cc30: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cc40: 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  w==0 || sqlite3P
cc50: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
cc60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cc70: 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >1 );.    assert
cc80: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
cc90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
cca0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
ccb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ccc0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
ccd0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
cce0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
ccf0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
cd00: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
cd10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
cd20: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
cd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cd40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cd50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cd60: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
cd70: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
cd80: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
cd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
cda0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
cdb0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
cdc0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
cdd0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
cde0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
cdf0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
ce00: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
ce10: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
ce20: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
ce30: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
ce40: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
ce50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ce60: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
ce70: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
ce80: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
ce90: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
cea0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
ceb0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
cec0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
ced0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
cee0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
cef0: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
cf00: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
cf10: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
cf20: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
cf30: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cf40: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
cf50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
cf60: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
cf70: 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
cf80: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
cf90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cfa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cfb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cfc0: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
cfd0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
cfe0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
cff0: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
d000: 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
d010: 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
d020: 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
d030: 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
d040: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
d050: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
d060: 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
d070: 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
d080: 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
d090: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
d0a0: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
d0b0: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
d0c0: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
d0d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
d0e0: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
d0f0: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
d100: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
d110: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
d120: 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
d130: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
d140: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
d150: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
d160: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
d170: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
d180: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
d190: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
d1a0: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
d1b0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
d1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
d1d0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
d1e0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
d1f0: 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
d200: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
d210: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
d220: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
d230: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
d240: 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
d250: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
d260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d280: 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
d290: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
d2a0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
d2b0: 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
d2c0: 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
d2d0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
d2e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
d2f0: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
d300: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d310: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d320: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
d330: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
d340: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
d350: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
d360: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
d370: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
d380: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
d390: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
d3a0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
d3b0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
d3c0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
d3d0: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
d3e0: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
d3f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
d400: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
d410: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
d420: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
d430: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
d440: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
d450: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
d460: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
d470: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d480: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
d490: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
d4a0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
d4b0: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
d4c0: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
d4d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
d4e0: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
d4f0: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
d500: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
d510: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
d520: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d530: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
d540: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
d550: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
d560: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
d570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
d580: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
d590: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
d5a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
d5b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d5c0: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
d5d0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d5f0: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
d600: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
d610: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
d620: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d630: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
d640: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
d650: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
d660: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
d670: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
d680: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
d690: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
d6a0: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
d6b0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
d6c0: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
d6d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d6f0: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
d700: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
d710: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
d720: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
d730: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
d740: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
d750: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
d760: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
d770: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
d780: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
d790: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
d7a0: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
d7b0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
d7c0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
d7d0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
d7e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d7f0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
d800: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
d810: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
d820: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
d830: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
d840: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
d850: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
d860: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
d870: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
d880: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
d890: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
d8a0: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
d8b0: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
d8c0: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
d8d0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
d8e0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
d8f0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
d900: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
d910: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
d920: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
d930: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
d940: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
d950: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
d960: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
d970: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
d980: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
d990: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
d9a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
d9c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
d9d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d9e0: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
d9f0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
da00: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
da10: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
da20: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
da30: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
da40: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
da50: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
da60: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
da70: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
da80: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
da90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
daa0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
dab0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
dac0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
dad0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
dae0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
daf0: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
db00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
db10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
db20: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
db30: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
db40: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
db50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
db60: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
db70: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
db80: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
db90: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
dba0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dbb0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
dbc0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
dbd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
dbe0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
dbf0: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
dc00: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
dc10: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
dc20: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
dc30: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
dc40: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
dc50: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
dc60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
dc70: 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61  db==0 && zFilena
dc80: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
dc90: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  0] ){.    if( sq
dca0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
dcb0: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
dcc0: 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  bled ){.      in
dcd0: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
dce0: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
dcf0: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
dd00: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
dd10: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
dd20: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
dd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
dd40: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
dd50: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
dd60: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ble = 1;.      d
dd70: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
dd80: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
dd90: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
dda0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
ddb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ddc0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
ddd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ddf0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
de00: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
de10: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
de20: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
de30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
de40: 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
de50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
de60: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
de70: 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
de80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
de90: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
dea0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
deb0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
dec0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
ded0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
dee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
def0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
df00: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
df10: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
df20: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
df30: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
df40: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
df50: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
df60: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
df70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
df80: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
df90: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
dfa0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
dfb0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
dfd0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
dfe0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
dff0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
e000: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
e010: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
e020: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
e030: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
e040: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
e050: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
e060: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
e070: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
e080: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
e090: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
e0a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e0c0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e0d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e0f0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
e100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e110: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e160: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e180: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
e190: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
e1a0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
e1b0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
e1c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
e1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e1e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e1f0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
e200: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e210: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e220: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
e230: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
e240: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
e250: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
e260: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
e270: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
e280: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
e290: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
e2a0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
e2b0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
e2c0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
e2d0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
e2e0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
e2f0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
e300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
e310: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
e320: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
e330: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
e340: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e350: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
e360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e370: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
e380: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
e390: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
e3a0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
e3b0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
e3c0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
e3d0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
e3e0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
e3f0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
e400: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
e410: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
e420: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
e430: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
e440: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
e450: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
e460: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e470: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
e480: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
e490: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e4a0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
e4b0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
e4c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e4d0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
e4e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
e4f0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
e500: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
e510: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
e520: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
e530: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
e540: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
e550: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
e560: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e570: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e580: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
e590: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e5a0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e5b0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
e5c0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
e5f0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
e600: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
e610: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e620: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e630: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
e640: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
e650: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
e660: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
e670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e690: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
e6a0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
e6b0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
e6c0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
e6d0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
e6e0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
e6f0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
e700: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
e710: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
e720: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
e730: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
e740: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
e750: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
e760: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
e770: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e780: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
e790: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
e7a0: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
e7b0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
e7c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
e7d0: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
e7e0: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
e7f0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
e800: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
e810: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
e820: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
e830: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
e840: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
e850: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
e860: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
e870: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
e880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e890: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
e8a0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
e8b0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
e8c0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
e8d0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
e8e0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
e8f0: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
e900: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
e910: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
e920: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
e930: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
e940: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
e950: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
e960: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
e970: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
e980: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
e990: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
e9a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
e9b0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
e9c0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
e9d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
e9e0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
e9f0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
ea00: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
ea10: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
ea20: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
ea30: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
ea40: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
ea50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ea60: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
ea70: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
ea80: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
ea90: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
eaa0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
eab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
eac0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
ead0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
eae0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
eaf0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
eb00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
eb10: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
eb20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eb30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
eb40: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
eb50: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
eb60: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
eb70: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
eb80: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
eb90: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
eba0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
ebb0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
ebc0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ebd0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ebe0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ebf0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
ec00: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
ec10: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
ec20: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
ec30: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
ec40: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
ec50: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
ec60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
ec70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
ec80: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
ec90: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
eca0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
ecb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ecc0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ecd0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
ece0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ecf0: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
ed00: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
ed10: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
ed20: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
ed30: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
ed40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ed50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ed70: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
ed80: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
ed90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
eda0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
edb0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
edc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
edd0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
ede0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
edf0: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
ee00: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
ee10: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
ee20: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
ee30: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
ee40: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
ee50: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
ee60: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
ee70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
ee80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ee90: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
eea0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
eeb0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
eec0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
eed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
eef0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ef00: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
ef10: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
ef20: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
ef30: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ef40: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
ef50: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
ef60: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ef70: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
ef80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ef90: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
efa0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
efb0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
efc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
efd0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
efe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eff0: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
f000: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
f010: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
f020: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
f030: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
f040: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
f050: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
f060: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
f070: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
f080: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
f090: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
f0a0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
f0b0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
f0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
f0d0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
f0e0: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
f0f0: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
f100: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f110: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
f120: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
f130: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
f140: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
f150: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
f160: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
f170: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
f180: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
f190: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
f1b0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
f1c0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f1d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f1e0: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
f1f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f200: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
f210: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
f220: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
f230: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
f240: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
f250: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
f260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f270: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
f280: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
f290: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
f2a0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
f2b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
f2c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
f2d0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
f2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f2f0: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
f300: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
f310: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f330: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
f340: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
f350: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
f360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f370: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
f380: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
f390: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f3a0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
f3b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
f3c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
f3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f3e0: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
f3f0: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ee = 0;.  }.  if
f400: 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
f410: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f420: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
f430: 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
f440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f450: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
f460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
f480: 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
f490: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
f4a0: 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
f4b0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
f4c0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
f4d0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
f4e0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
f4f0: 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
f500: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
f510: 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
f520: 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
f530: 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
f540: 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
f550: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
f560: 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
f570: 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
f580: 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
f590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
f5a0: 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69  RED_CACHE.  sqli
f5b0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
f5c0: 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  er;.  BtShared *
f5d0: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
f5e0: 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
f5f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f600: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
f610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73  mutex) );.  pMas
f620: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
f630: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f640: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f650: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
f660: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
f670: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
f680: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
f690: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
f6a0: 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
f6b0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f6c0: 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
f6d0: 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
f6e0: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f6f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f700: 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
f710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f720: 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
f730: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f740: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f750: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
f760: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
f770: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
f780: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
f790: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
f7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7b0: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
f7c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
f7d0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
f7e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
f7f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
f800: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
f810: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f820: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
f830: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
f840: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
f850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f860: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
f870: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
f880: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
f890: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
f8b0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
f8c0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
f8d0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
f8e0: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
f8f0: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
f900: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
f910: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
f920: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
f930: 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
f940: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
f950: 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
f960: 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
f970: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
f980: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
f990: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
f9a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
f9b0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
f9c0: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
f9d0: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
f9e0: 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
f9f0: 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
fa00: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
fa10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
fa20: 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
fa30: 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
fa40: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
fa50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
fa60: 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
fa70: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
fa80: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
fa90: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
faa0: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
fab0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
fac0: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
fad0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
fae0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
faf0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
fb00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
fb10: 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
fb20: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
fb30: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
fb40: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
fb50: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
fb60: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
fb70: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
fb80: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
fb90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fba0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
fbb0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
fbc0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
fbd0: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
fbe0: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
fbf0: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
fc00: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
fc10: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
fc20: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
fc30: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
fc40: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
fc50: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
fc60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
fc70: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
fc80: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
fc90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
fca0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
fcb0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
fcc0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
fcd0: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
fce0: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
fcf0: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
fd00: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
fd10: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
fd20: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
fd30: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
fd40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
fd50: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
fd60: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
fd70: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
fd80: 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
fd90: 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
fda0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
fdb0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
fdc0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
fdd0: 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
fde0: 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
fdf0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
fe00: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
fe10: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
fe20: 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
fe30: 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
fe40: 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
fe50: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
fe60: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
fe70: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fe80: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
fe90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
fea0: 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
feb0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
fec0: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
fed0: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
fee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fef0: 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53  te3_free(pBt->pS
ff00: 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
ff10: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
ff20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff30: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
ff40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff50: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
ff60: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
ff70: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
ff80: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
ff90: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
ffa0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
ffb0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
ffc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
ffd0: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
ffe0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
fff0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
10000 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
10010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10020 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10030 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
10040 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
10050 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
10060 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
10070 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10080 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
10090 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
100a0 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
100b0 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
100c0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
100d0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
100e0 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
100f0 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
10100 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
10110 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
10120 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
10130 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
10140 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
10150 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
10160 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
10170 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
10180 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10190 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
101a0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
101b0 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
101c0 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
101d0 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
101e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
101f0 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
10200 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
10210 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
10220 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
10230 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
10240 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
10250 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
10260 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
10270 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
10280 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
10290 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
102a0 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
102b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
102c0 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
102d0 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
102e0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
102f0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
10300 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
10310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10320 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
10330 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10340 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
10350 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
10360 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10370 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10380 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
10390 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
103a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
103b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
103c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
103d0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
103e0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
103f0 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
10400 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
10410 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
10420 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
10430 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
10440 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
10450 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
10460 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
10470 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
10480 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
10490 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
104a0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
104b0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
104c0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
104d0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
104e0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
104f0 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
10500 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
10510 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10520 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
10530 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
10540 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
10550 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
10560 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
10570 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
10580 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
10590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
105a0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
105b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
105c0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
105d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
105e0 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
105f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10600 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10610 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10620 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10630 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10640 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10650 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10660 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
10670 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
10680 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
10690 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
106a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
106b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
106c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
106d0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
106e0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
106f0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
10700 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
10710 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
10720 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
10730 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
10740 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
10750 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
10760 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
10770 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
10780 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10790 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
107a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107b0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
107c0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
107d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
107e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
107f0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
10800 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10810 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
10820 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
10830 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10850 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10860 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
10870 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
10880 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10890 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
108a0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
108b0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
108c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
108d0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
108e0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
108f0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
10900 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10910 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
10920 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
10930 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
10940 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
10950 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
10960 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
10970 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
10980 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
10990 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
109a0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
109b0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
109c0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
109d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
109e0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
109f0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
10a00 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
10a10 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
10a20 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
10a30 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
10a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10a50 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
10a60 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
10a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
10a80 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10a90 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
10aa0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
10ab0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
10ac0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
10ad0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
10ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
10af0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
10b00 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
10b10 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
10b20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
10b30 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
10b40 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
10b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
10b60 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
10b70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
10b80 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
10b90 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
10ba0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
10bb0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
10bc0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
10bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10be0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
10bf0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
10c00 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
10c10 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
10c20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10c30 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
10c40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10c50 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
10c60 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
10c70 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
10c80 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10c90 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
10ca0 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
10cb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
10cc0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10ce0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
10cf0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
10d00 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
10d10 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
10d20 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
10d30 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10d40 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
10d50 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
10d60 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
10d70 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
10d80 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
10d90 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
10da0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
10db0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
10dc0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
10dd0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
10de0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
10df0 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
10e00 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
10e10 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
10e20 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
10e30 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10e40 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
10e50 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10e60 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
10e70 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
10e80 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
10e90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10ea0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
10eb0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
10ec0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
10ed0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ee0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
10ef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10f10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
10f20 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
10f30 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
10f40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
10f50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10f60 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
10f70 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
10f80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10f90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
10fa0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
10fb0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
10fc0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
10fd0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
10fe0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
10ff0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11000 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11010 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11020 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11040 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11050 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11060 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11070 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11080 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11090 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
110a0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
110b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
110c0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
110d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
110e0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
110f0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11100 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11110 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11120 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11130 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11140 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11150 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11160 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11170 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11180 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11190 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
111a0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
111b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
111c0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
111d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
111e0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
111f0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11200 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11210 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11220 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11230 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11240 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
11250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11260 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11270 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
11280 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
11290 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
112a0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
112b0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
112c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
112d0 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
112e0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
112f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
11300 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
11310 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
11320 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
11330 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
11340 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
11350 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
11360 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
11370 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
11380 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
11390 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
113a0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
113b0 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
113c0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
113d0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
113e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
113f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11410 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
11420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11430 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11450 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
11460 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
11470 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11480 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
11490 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61  eSizeFixed && (a
114a0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
114b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
114c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
114d0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
114e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
114f0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
11500 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11510 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
11520 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11530 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11540 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
11550 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11560 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11570 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
11580 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
11590 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
115a0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
115b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
115c0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
115d0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
115e0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
115f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11600 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
11610 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
11620 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
11630 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
11640 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11650 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
11660 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
11670 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
11680 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
11690 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
116a0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
116b0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
116c0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
116d0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
116e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
116f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11700 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
11710 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
11720 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
11730 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11740 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
11750 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
11760 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
11770 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
11780 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11790 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
117a0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
117b0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
117c0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
117d0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
117e0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
117f0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
11800 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
11810 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11820 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
11830 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
11840 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
11850 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
11860 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
11870 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
11880 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
11890 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
118a0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
118b0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
118c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
118d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
118e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
118f0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
11900 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
11910 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
11920 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
11930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
11940 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
11950 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
11960 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
11970 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
11980 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
11990 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
119a0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
119b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
119c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
119d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
119e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
119f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
11a00 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
11a10 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
11a20 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
11a30 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
11a40 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
11a50 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
11a60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
11a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11a80 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
11a90 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
11aa0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
11ab0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
11ac0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
11ad0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11ae0 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
11af0 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
11b00 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
11b10 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
11b20 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
11b30 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
11b40 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
11b50 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
11b60 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
11b70 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11b80 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
11b90 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
11ba0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
11bb0 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
11bc0 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
11bd0 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
11be0 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
11bf0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
11c00 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
11c10 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
11c20 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
11c30 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
11c40 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
11c50 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
11c60 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
11c70 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
11c80 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
11c90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11ca0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
11cc0 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
11cd0 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
11ce0 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
11cf0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
11d00 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
11d10 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
11d20 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11d30 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
11d40 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
11d50 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
11d60 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11d70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11d80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
11d90 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
11da0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
11db0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
11dc0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
11dd0 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
11de0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
11df0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
11e00 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
11e10 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
11e20 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
11e30 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
11e40 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
11e50 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
11e60 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
11e70 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
11e80 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
11e90 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
11ea0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11eb0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
11ec0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
11ed0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
11ee0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
11ef0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
11f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
11f10 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
11f20 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
11f30 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
11f40 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
11f50 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
11f60 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
11f70 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
11f80 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
11f90 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
11fa0 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
11fb0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11fc0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
11fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11fe0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11ff0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
12000 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
12030 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
12040 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
12050 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12060 69 6c 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75  iled;.      retu
12070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12080 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
12090 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
120a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
120b0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
120c0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
120d0 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
120e0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
120f0 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
12100 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
12110 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12120 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
12130 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
12140 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
12150 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
12160 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
12170 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
12180 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
12190 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
121a0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
121b0 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
121c0 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
121d0 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
121e0 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
121f0 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
12200 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
12210 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
12220 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
12230 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
12240 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
12250 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
12260 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
12270 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
12280 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
12290 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
122a0 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
122b0 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
122c0 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
122d0 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
122e0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
122f0 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
12300 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
12310 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
12320 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
12330 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
12340 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
12350 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
12360 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
12370 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
12380 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
12390 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
123a0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
123b0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
123c0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
123d0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
123e0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
123f0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
12400 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
12410 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
12420 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
12430 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
12440 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
12450 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
12460 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
12470 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
12480 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
12490 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
124a0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
124b0 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
124c0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
124d0 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
124e0 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
124f0 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
12500 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12510 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
12520 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
12530 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
12540 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
12550 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
12560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
12570 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
12580 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
12590 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
125a0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
125b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
125c0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
125d0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
125e0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
125f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
12600 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
12610 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
12620 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
12630 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
12640 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
12650 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
12660 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
12670 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
12680 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
12690 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
126a0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
126b0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
126c0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
126d0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
126e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
126f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
12710 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20  ->pCursor==0 || 
12720 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12730 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
12740 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
12750 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
12760 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
12770 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61  age1!=0 ){.    a
12780 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
12790 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
127a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
127b0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
127c0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
127d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
127e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
127f0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
12800 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
12810 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
12820 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
12830 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12840 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
12850 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
12860 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
12870 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
12880 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
12890 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
128a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
128b0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
128c0 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
128d0 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
128e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
128f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12900 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
12910 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12920 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12930 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
12940 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12950 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
12960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12970 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
12980 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
12990 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
129a0 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
129b0 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
129c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
129d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
129e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
129f0 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
12a00 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
12a10 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12a20 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
12a30 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
12a40 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
12a50 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
12a60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
12a70 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
12a80 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
12a90 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12aa0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
12ab0 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
12ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
12ad0 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
12ae0 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
12af0 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
12b00 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
12b10 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
12b20 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
12b30 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
12b40 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
12b50 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
12b60 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
12b70 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
12b80 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
12b90 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
12ba0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
12bb0 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
12bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12bd0 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
12be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
12bf0 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
12c00 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
12c10 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
12c20 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
12c30 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
12c40 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12c50 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
12c60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
12c70 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
12c80 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
12c90 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
12ca0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
12cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12cc0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
12cd0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
12ce0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
12cf0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12d00 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
12d10 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12d20 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
12d30 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
12d40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
12d50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12d60 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
12d70 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
12d80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
12d90 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
12da0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
12db0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
12dc0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
12dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12de0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
12df0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
12e00 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
12e10 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
12e20 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12e30 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
12e40 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
12e50 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
12e60 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
12e70 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
12e80 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
12e90 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
12ea0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
12eb0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
12ec0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
12ed0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
12ee0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
12ef0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
12f00 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
12f10 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
12f20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
12f30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
12f40 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
12f50 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
12f60 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
12f70 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
12f80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
12f90 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
12fa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
12fb0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
12fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
12fd0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
12fe0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
12ff0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13000 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
13010 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
13020 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
13030 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
13040 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
13050 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
13060 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
13070 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
13080 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
13090 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
130a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
130b0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
130c0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
130d0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
130e0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
130f0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
13100 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
13110 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
13120 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
13130 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
13140 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
13150 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13160 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
13170 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
13180 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
13190 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
131a0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
131b0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
131c0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
131d0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
131e0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
131f0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
13200 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
13210 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
13220 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
13230 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
13240 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
13250 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
13260 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
13270 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
13280 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
13290 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
132a0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
132b0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
132c0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
132d0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
132e0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
132f0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
13300 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
13310 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
13320 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
13330 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
13340 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
13350 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13360 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
13370 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
13380 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
13390 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
133a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
133b0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
133c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
133d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
133e0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
133f0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13400 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
13410 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
13420 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
13430 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
13440 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
13450 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
13460 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
13470 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
13480 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
13490 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
134a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
134b0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
134c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
134d0 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
134e0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
134f0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13500 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
13510 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
13520 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
13530 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
13540 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
13550 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
13560 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
13570 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13580 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13590 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
135a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
135b0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
135c0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
135d0 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
135e0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
135f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13600 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
13610 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
13620 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
13630 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
13640 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
13650 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
13660 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
13670 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
13680 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
13690 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
136a0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
136b0 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
136c0 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
136d0 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
136e0 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
136f0 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
13700 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
13710 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
13720 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
13730 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
13740 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
13750 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13760 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13770 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13790 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
137a0 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
137b0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
137c0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
137d0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
137e0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
137f0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13800 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13810 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13820 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13830 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13850 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13860 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13870 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13880 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13890 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
138a0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
138b0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
138c0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
138d0 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
138e0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ed. */.  if( SQL
138f0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 71 75  ITE_OK!=(rc = qu
13900 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13910 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13920 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13930 4b 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  K)) ){.    goto 
13940 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13950 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
13960 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
13970 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
13980 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
13990 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
139a0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
139b0 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
139c0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
139d0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
139e0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
139f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
13a00 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
13a10 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
13a20 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
13a30 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
13a40 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
13a50 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
13a60 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
13a70 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
13a80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
13a90 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
13aa0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
13ab0 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
13ac0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
13ad0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
13ae0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
13af0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
13b00 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
13b10 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
13b20 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
13b30 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
13b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b50 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
13b60 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
13b70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
13b80 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
13b90 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
13ba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13bb0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
13bc0 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
13bd0 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
13be0 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
13bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
13c20 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
13c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c40 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
13c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13c60 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
13c70 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
13c80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
13c90 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
13ca0 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
13cb0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13cc0 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
13cd0 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
13ce0 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
13cf0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
13d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
13d10 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13d20 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
13d30 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13d40 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
13d50 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13d60 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
13d70 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
13d80 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b  .assert( p->lock
13d90 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
13da0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
13db0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
13dc0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
13dd0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
13de0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
13df0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
13e00 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
13e10 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
13e20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
13e30 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
13e40 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
13e50 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
13e60 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
13e70 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
13e80 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
13e90 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13ea0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
13eb0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13ec0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13ed0 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77  _CACHE.    if( w
13ee0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  rflag ){.      a
13ef0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
13f00 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
13f10 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
13f20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63        pBt->isExc
13f30 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72  lusive = (u8)(wr
13f40 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23  flag>1);.    }.#
13f50 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e  endif.  }...tran
13f60 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
13f70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13f80 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
13f90 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
13fa0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
13fb0 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
13fc0 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
13fd0 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
13fe0 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
13ff0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
14000 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
14010 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
14020 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
14030 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
14040 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
14050 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
14060 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
14070 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
14080 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
14090 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
140a0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
140b0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
140c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
140d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
140e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
140f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14100 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
14110 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
14120 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
14130 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
14140 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
14150 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
14160 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
14170 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
14180 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
14190 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
141a0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
141b0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
141c0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
141d0 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
141e0 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
141f0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
14200 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14220 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
14230 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
14240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14260 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
14270 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
14280 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
142b0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
142c0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
142d0 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
142e0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
142f0 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
14300 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
14310 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14320 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
14330 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
14340 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
14350 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
14360 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
14380 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
14390 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
143a0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
143b0 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
143c0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
143d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
143e0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
143f0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
14400 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
14410 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
14420 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
14440 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
14450 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
14460 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
14470 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
14480 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
14490 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
144a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
144b0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
144c0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
144d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
144e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
144f0 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
14500 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
14510 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
14520 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
14530 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
14540 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
14550 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
14560 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
14570 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
14580 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
14590 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
145a0 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
145b0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
145c0 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
145d0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
145e0 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
145f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
14600 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
14610 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
14620 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
14630 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
14640 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
14650 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
14660 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
14670 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
14680 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
14690 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
146a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
146b0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
146c0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
146d0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
146e0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
146f0 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
14700 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
14710 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
14720 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
14730 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
14740 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
14750 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
14760 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
14790 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
147a0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
147b0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
147c0 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
147d0 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
147e0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
147f0 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
14800 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14810 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
14820 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
14830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
14840 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
14850 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
14860 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
14870 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
14880 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
14890 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
148a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
148b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
148c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
148d0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
148e0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
148f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
14900 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
14910 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
14920 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
14930 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
14940 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
14950 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
14960 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
14970 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
14980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14990 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
149a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
149b0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
149c0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
149d0 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
149e0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
149f0 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
14a00 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
14a10 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61  .    btreeInitPa
14a20 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e  ge(pPage);.    n
14a30 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
14a40 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
14a50 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
14a60 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
14a70 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
14a80 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
14a90 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
14aa0 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
14ab0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
14ac0 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  fo;.        btre
14ad0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
14ae0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
14af0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
14b00 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
14b10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14b20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
14b30 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
14b40 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20  rflow]) ){.     
14b50 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
14b60 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
14b70 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
14b80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14b90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
14bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
14bc0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
14bd0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
14be0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
14bf0 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
14c00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14c10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14c20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
14c30 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
14c40 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
14c50 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
14c60 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
14c70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
14c80 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
14c90 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
14ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14cb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
14cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
14cd0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14ce0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14cf0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
14d00 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
14d10 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
14d20 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
14d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14d40 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
14d50 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
14d60 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
14d70 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
14d80 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
14d90 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
14da0 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
14db0 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a  mains valid..*/.
14dc0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
14dd0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
14de0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
14df0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
14e00 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
14e10 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
14e20 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
14e30 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e50 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
14e60 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
14e70 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
14e80 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
14e90 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
14ea0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
14eb0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
14ec0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
14ed0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
14ee0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
14ef0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
14f00 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
14f10 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
14f20 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
14f30 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
14f40 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
14f50 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
14f60 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
14f70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
14f80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
14f90 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
14fa0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
14fb0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
14fc0 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
14fd0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
14fe0 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
14ff0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
15000 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
15010 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
15020 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15030 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15050 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
15060 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
15070 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
15080 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
15090 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
150a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
150b0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
150c0 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
150d0 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
150e0 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
150f0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
15100 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
15110 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
15120 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
15130 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
15140 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
15150 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
15160 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
15170 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
15180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
151a0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
151b0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
151c0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
151d0 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
151e0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
151f0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
15200 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
15210 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
15220 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
15230 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
15240 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
15250 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
15260 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
15270 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
15280 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
15290 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
152a0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
152b0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
152c0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
152d0 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
152e0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
152f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
15300 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
15310 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
15320 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
15330 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
15340 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
15350 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
15360 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15370 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
15380 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
15390 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
153a0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
153b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
153c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
153d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
153e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
153f0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
15400 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
15410 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
15420 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
15430 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
15440 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
15450 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
15460 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
15470 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
15480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15490 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
154a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
154b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
154c0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
154d0 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
154e0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
154f0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
15500 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
15510 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
15520 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
15530 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15540 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
15550 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
15560 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
15570 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
15580 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
15590 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
155a0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
155b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
155c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
155d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
155e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
155f0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
15600 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
15610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15620 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
15630 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
15640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15650 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
15660 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
15670 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
15680 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
15690 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
156a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
156b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
156c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
156d0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
156e0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
156f0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
15700 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
15710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15720 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
15730 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
15740 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
15750 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
15760 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
15770 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
15780 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
15790 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
157a0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
157b0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
157c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
157d0 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
157e0 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
157f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
15800 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
15810 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
15820 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
15830 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
15840 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
15850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15860 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
15870 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
15880 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
15890 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
158a0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
158b0 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
158c0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
158d0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
158e0 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
158f0 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
15900 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
15910 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
15920 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65  -zero, the imple
15930 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
15940 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
15950 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
15960 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
15970 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
15980 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
15990 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
159a0 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
159b0 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
159c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
159d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
159e0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
159f0 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
15a00 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  ss is complete..
15a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
15a20 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
15a30 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
15a40 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
15a50 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  tPg){.  Pgno nFr
15a60 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
15a70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15a80 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
15a90 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
15aa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ab0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15ac0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15ad0 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
15ae0 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
15af0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
15b00 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
15b10 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
15b20 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
15b30 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15b40 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
15b50 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
15b60 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
15b70 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
15b80 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
15b90 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
15ba0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
15bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15bc0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
15bd0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
15be0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
15bf0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
15c00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15c20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15c30 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
15c40 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
15c50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15c60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15c70 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
15c80 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15c90 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
15ca0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
15cb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
15cc0 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
15cd0 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
15ce0 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
15cf0 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
15d00 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
15d10 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
15d20 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
15d30 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
15d40 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
15d50 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
15d60 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
15d70 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
15d80 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
15d90 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
15da0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
15db0 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
15dc0 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
15dd0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
15de0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
15df0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
15e00 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
15e10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
15e20 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
15e30 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
15e40 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
15e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15e60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
15e70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
15e80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15e90 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
15ea0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
15eb0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
15ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15ed0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
15ee0 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
15ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15f00 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
15f10 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
15f20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
15f30 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
15f40 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
15f50 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
15f60 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
15f70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15f90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15fa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15fb0 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
15fc0 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
15fd0 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
15fe0 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
15ff0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
16000 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
16010 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
16020 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
16030 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
16040 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
16050 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
16060 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
16070 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
16080 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
16090 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
160a0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
160b0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
160c0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
160d0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
160e0 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
160f0 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
16100 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
16110 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
16120 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
16130 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
16140 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
16150 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
16160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
16180 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
16190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
161a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
161b0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
161c0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
161d0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
161e0 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
161f0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
16200 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
16210 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
16220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
16230 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
16240 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
16250 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16270 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
16280 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
16290 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
162a0 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
162b0 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
162c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
162d0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
162e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
162f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16300 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16310 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
16320 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
16330 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
16340 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
16350 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
16360 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
16370 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
16380 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
16390 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
163a0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
163b0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
163c0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69   *pPg;.        i
163d0 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
163e0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
163f0 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
16400 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16420 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16450 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
16460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
16470 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
16480 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
164a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
164b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
164c0 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74     }.      iLast
164d0 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Pg--;.    }.    
164e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
164f0 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
16500 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b  Pager, iLastPg);
16510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16520 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16530 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
16540 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
16550 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
16560 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
16570 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
16580 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
16590 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
165a0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
165b0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
165c0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
165d0 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
165e0 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
165f0 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
16600 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
16610 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
16620 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
16630 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
16640 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
16650 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16660 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
16670 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16680 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
16690 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
166a0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
166b0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
166c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
166d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
166e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
166f0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
16700 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
16710 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
16720 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
16730 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
16740 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
16750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
16760 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
16770 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
16780 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
16790 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
167a0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
167b0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
167c0 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pBt));.  }.  sql
167d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
167e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
167f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16800 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16810 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
16820 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
16830 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
16840 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f  * is commited fo
16850 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
16860 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
16870 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
16880 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
16890 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
168a0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
168b0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
168c0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
168d0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
168e0 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
168f0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
16900 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
16910 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
16920 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
16930 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
16940 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
16950 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
16960 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
16970 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
16980 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
16990 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
169a0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
169b0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
169c0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
169d0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
169e0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
169f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65  ager) );..  asse
16a00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16a10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
16a20 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
16a30 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
16a40 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
16a50 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
16a60 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
16a70 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
16a80 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20    Pgno nFin;.   
16a90 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20   Pgno nFree;.   
16aa0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20   Pgno nPtrmap;. 
16ab0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20     Pgno iFree;. 
16ac0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
16ad0 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
16ae0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e;.    Pgno nOri
16af0 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  g = pagerPagecou
16b00 6e 74 28 70 42 74 29 3b 0a 0a 20 20 20 20 69 66  nt(pBt);..    if
16b10 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
16b20 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
16b30 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
16b40 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
16b50 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
16b60 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
16b70 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
16b80 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
16b90 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
16ba0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
16bb0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
16bc0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
16bd0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
16be0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
16bf0 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
16c00 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
16c10 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
16c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16c30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16c40 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
16c50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
16c60 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
16c70 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61  36]);.    nPtrma
16c80 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
16c90 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
16ca0 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f  Bt, nOrig)+pgsz/
16cb0 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20  5)/(pgsz/5);.   
16cc0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
16cd0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
16ce0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  .    if( nOrig>P
16cf0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16d00 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
16d10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
16d20 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
16d30 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
16d40 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
16d50 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
16d60 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
16d70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16d80 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  ){.      nFin--;
16d90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
16da0 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
16db0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16dc0 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72  T_BKPT;..    for
16dd0 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
16de0 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
16df0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
16e00 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
16e10 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
16e20 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29  Bt, nFin, iFree)
16e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16e40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
16e50 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
16e60 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
16e70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16e80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20  TE_OK;.      rc 
16e90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16ea0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
16eb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
16ec0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
16ed0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
16ee0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
16ef0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
16f00 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
16f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16f20 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
16f30 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
16f40 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nFin);.    }.   
16f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
16f70 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
16f80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
16f90 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
16fa0 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
16fb0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
16fc0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
16fd0 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
16fe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16ff0 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
17000 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
17010 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
17020 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
17030 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17040 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
17050 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
17060 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
17070 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
17080 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
17090 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
170a0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
170b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
170c0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
170d0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
170e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
170f0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
17100 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
17110 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
17120 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
17130 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
17140 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
17150 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
17160 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
17170 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
17180 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
17190 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
171a0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
171b0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
171c0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
171d0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
171e0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
171f0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
17200 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
17210 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
17220 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
17230 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
17240 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
17250 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
17260 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
17270 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
17280 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
17290 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
172a0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
172b0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
172c0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
172d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
172e0 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
172f0 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
17300 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
17310 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
17320 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
17330 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
17340 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
17350 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
17360 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
17370 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
17380 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
17390 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
173a0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
173b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
173c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
173d0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
173e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
173f0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
17400 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
17410 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
17420 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
17430 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
17440 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
17450 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
17460 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
17470 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
17480 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
17490 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
174a0 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
174b0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
174c0 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
174d0 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
174e0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
174f0 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
17500 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
17510 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
17520 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
17530 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
17540 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
17550 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
17560 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
17570 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
17580 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
17590 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
175a0 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
175b0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
175c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
175d0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
175e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
175f0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
17600 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17610 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17620 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
17630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17640 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
17650 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
17660 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
17670 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
17680 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
17690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
176a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
176b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
176c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
176d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
176e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
176f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
17700 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
17710 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
17720 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
17730 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17760 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17770 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
17780 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
17790 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
177a0 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
177b0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
177c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
177d0 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
177e0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
177f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
17800 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17810 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
17820 2a 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28  *pCsr;.  assert(
17830 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
17840 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20  dsMutex(p) );.. 
17850 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
17860 20 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70 65   cursor held ope
17870 6e 20 62 79 20 74 68 69 73 20 62 2d 74 72 65 65  n by this b-tree
17880 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20   connection. If 
17890 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a  one exists,.  **
178a0 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   then the transa
178b0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ction will be do
178c0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72 65  wngraded to a re
178d0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
178e0 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64  ion.  ** instead
178f0 20 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e   of actually con
17900 63 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65 71  cluded. A subseq
17910 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d  uent call to Com
17920 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a 20  mitPhaseTwo() . 
17930 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28   ** or Rollback(
17940 29 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74 68  ) will finish th
17950 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
17960 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  d unlock the dat
17970 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72  abase.  */.  for
17980 28 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCsr=pBt->pCurs
17990 6f 72 3b 20 70 43 73 72 20 26 26 20 70 43 73 72  or; pCsr && pCsr
179a0 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43 73  ->pBtree!=p; pCs
179b0 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a  r=pCsr->pNext);.
179c0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 3d 3d    assert( pCsr==
179d0 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  0 || p->inTrans>
179e0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  TRANS_NONE );.. 
179f0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
17a00 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66  ntent(pBt);.  if
17a10 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64 6f  ( pCsr ){.    do
17a20 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
17a30 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
17a40 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
17a50 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
17a60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17a70 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
17a80 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
17a90 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
17aa0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
17ab0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17ac0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
17ad0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
17ae0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17af0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
17b00 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
17b10 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
17b20 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
17b30 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
17b40 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
17b50 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
17b60 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
17b70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
17b80 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
17b90 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
17ba0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
17bb0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
17bc0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
17bd0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
17be0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
17bf0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
17c00 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
17c10 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
17c20 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
17c30 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
17c40 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
17c50 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
17c60 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
17c70 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
17c80 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
17c90 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
17ca0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
17cb0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
17cc0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
17cd0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
17ce0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
17cf0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
17d00 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
17d10 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
17d20 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
17d30 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
17d40 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
17d50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17d60 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
17d70 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
17d80 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
17d90 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
17da0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17db0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
17dc0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
17dd0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
17de0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
17df0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
17e00 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
17e10 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
17e20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
17e30 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
17e40 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
17e50 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
17e60 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
17e70 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
17e80 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
17e90 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
17ea0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
17eb0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
17ec0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
17ed0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
17ee0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
17ef0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
17f00 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
17f10 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
17f20 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
17f30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17f40 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
17f50 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
17f60 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
17f70 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
17f80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17f90 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
17fa0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
17fb0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
17fc0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
17fd0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
17fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17ff0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
18000 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  o(Btree *p){.  B
18010 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18020 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
18030 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18040 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
18050 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
18060 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
18070 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
18080 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
18090 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
180a0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
180b0 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
180c0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
180d0 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
180e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
180f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
18100 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
18110 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
18120 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
18130 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
18140 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
18150 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
18160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18170 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
18180 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
18190 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
181a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
181b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
181c0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
181d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
181e0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
181f0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
18200 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
18210 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
18220 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18230 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18250 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
18260 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
18270 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18280 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
18290 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
182a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
182b0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
182c0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
182d0 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
182e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
182f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
18300 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18310 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
18320 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18330 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18340 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18350 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
18360 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18370 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
18380 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
18390 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
183a0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
183b0 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
183c0 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
183d0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
183e0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
183f0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
18400 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
18410 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
18420 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
18430 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
18440 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
18450 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
18460 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
18470 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
18480 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
18490 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
184a0 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
184b0 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
184c0 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
184d0 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
184e0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
184f0 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
18500 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
18510 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
18520 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
18530 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
18540 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
18550 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
18560 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
18570 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
18580 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
18590 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
185a0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
185b0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
185c0 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
185d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
185e0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
185f0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
18600 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
18610 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
18620 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
18630 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
18640 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
18650 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
18660 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
18670 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
18680 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
18690 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
186a0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
186b0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
186c0 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
186d0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
186e0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
186f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18700 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
18710 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
18720 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
18730 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
18740 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
18750 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
18760 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
18770 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
18780 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
18790 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
187a0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
187b0 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
187c0 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
187d0 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
187e0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
187f0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
18800 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
18810 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
18820 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
18830 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
18840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
18850 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
18860 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
18870 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
18880 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
18890 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
188a0 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
188b0 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
188c0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
188d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
188e0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
188f0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
18900 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
18910 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
18920 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
18930 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
18940 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
18950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
18960 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
18970 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
18980 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
18990 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
189a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
189b0 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
189c0 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
189d0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
189e0 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
189f0 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
18a00 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
18a10 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
18a20 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
18a30 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
18a40 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
18a50 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
18a60 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
18a70 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
18a80 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
18a90 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
18aa0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
18ab0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18ac0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
18ad0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
18ae0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
18af0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
18b00 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
18b10 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
18b20 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
18b30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
18b40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18b50 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
18b60 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
18b70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18b80 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
18b90 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
18ba0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
18bb0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
18bc0 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
18bd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
18be0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
18bf0 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
18c00 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
18c10 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  ) error occurred
18c20 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
18c30 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
18c40 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
18c50 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
18c60 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
18c70 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
18c80 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
18c90 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
18ca0 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
18cb0 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
18cc0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
18cd0 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
18ce0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
18cf0 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
18d00 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
18d10 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
18d20 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
18d30 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
18d40 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
18d50 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
18d60 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
18d70 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
18d80 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
18d90 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
18da0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
18db0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
18dc0 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
18dd0 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
18de0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
18df0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
18e00 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
18e10 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
18e20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
18e30 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
18e40 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
18e50 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
18e60 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
18e70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
18e80 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
18e90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
18ea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18eb0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
18ec0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
18ed0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
18ee0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
18ef0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
18f00 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
18f10 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
18f20 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
18f30 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
18f40 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
18f50 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
18f60 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
18f70 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
18f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
18f90 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18fa0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18fb0 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
18fc0 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
18fd0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
18fe0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
18ff0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  EAD;.  }..  btre
19000 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
19010 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
19020 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19030 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19040 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
19050 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
19060 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
19070 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62  action can can b
19080 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
19090 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
190a0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
190b0 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
190c0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
190d0 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
190e0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
190f0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
19100 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
19110 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
19120 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
19130 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
19140 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
19150 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
19160 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
19170 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
19180 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
19190 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
191a0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
191b0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
191c0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
191d0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
191e0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
191f0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
19200 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
19210 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
19220 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
19230 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
19240 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
19250 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
19260 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
19270 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
19280 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
19290 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
192a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
192b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
192c0 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
192d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
192e0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
192f0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
19300 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
19310 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
19320 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
19330 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
19340 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
19350 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
19360 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
19370 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
19380 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
19390 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
193a0 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
193b0 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
193c0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
193d0 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
193e0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
193f0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
19400 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
19410 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
19420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19430 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
19440 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
19450 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
19460 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19470 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
19480 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19490 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
194a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
194b0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
194c0 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  t( pBt->readOnly
194d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
194e0 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
194f0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
19500 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
19510 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28  vepoint );.  if(
19520 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e   NEVER(p->inTran
19530 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
19540 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29  | pBt->readOnly)
19550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19560 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
19570 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
19580 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
19590 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
195a0 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20  TE );.    /* At 
195b0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
195c0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
195d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
195e0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20  vepoint with.   
195f0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
19600 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
19610 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
19620 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
19630 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61  g.    ** SQL sta
19640 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
19650 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
19660 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
19670 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73  ack any.    ** s
19680 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
19690 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
196a0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
196b0 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
196c0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ve..    */.    r
196d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
196e0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
196f0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
19700 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
19710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19720 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
19740 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
19750 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
19760 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
19770 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19780 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
19790 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
197a0 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
197b0 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
197c0 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
197d0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
197e0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
197f0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
19800 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
19810 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
19820 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
19830 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
19840 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
19850 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
19860 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
19870 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19880 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
19890 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
198a0 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
198b0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
198c0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
198d0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
198e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
198f0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
19900 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
19910 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
19920 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
19930 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
19940 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
19950 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
19960 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
19970 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
19980 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
19990 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
199a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
199b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
199c0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
199d0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
199e0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
199f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
19a00 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
19a10 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
19a20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
19a30 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
19a40 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
19a50 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
19a60 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
19a70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19a80 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
19a90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19ab0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
19ac0 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
19ad0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
19ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19af0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19b00 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
19b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19b20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19b30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19b40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
19b50 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
19b60 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
19b70 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
19b80 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
19b90 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
19ba0 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
19bb0 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
19bc0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
19bd0 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
19be0 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
19bf0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
19c00 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
19c10 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
19c20 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
19c30 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
19c40 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
19c50 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
19c60 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
19c70 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
19c80 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
19c90 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
19ca0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
19cb0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
19cc0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
19cd0 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
19ce0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
19cf0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
19d00 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
19d10 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
19d20 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
19d30 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
19d40 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
19d50 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
19d60 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
19d70 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
19d80 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
19d90 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
19da0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
19db0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
19dc0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
19dd0 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
19de0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19df0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
19e00 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
19e10 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
19e20 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
19e30 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
19e40 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
19e50 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
19e60 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
19e70 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
19e80 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
19e90 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
19ea0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
19eb0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
19ec0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
19ed0 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
19ee0 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
19ef0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
19f00 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19f10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
19f20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
19f30 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
19f40 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
19f50 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
19f60 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
19f70 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
19f80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
19f90 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
19fa0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
19fb0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
19fc0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
19fd0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
19fe0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
19ff0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
1a000 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
1a010 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
1a020 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
1a030 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1a040 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
1a050 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20  reeCursorSize() 
1a060 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
1a070 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .** pointed to b
1a080 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e  y pCur have been
1a090 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63   zeroed by the c
1a0a0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
1a0b0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1a0c0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a0f0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1a100 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1a130 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1a140 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1a150 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a170 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1a180 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1a190 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1a1a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1a1b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1a1c0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1a1d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1a1e0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1a210 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1a220 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1a230 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1a240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a250 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1a260 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1a270 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1a280 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1a290 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1a2a0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1a2b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1a2c0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1a2d0 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1a2e0 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1a2f0 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1a300 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1a310 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1a320 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1a330 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1a340 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1a350 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1a360 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1a370 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1a380 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1a390 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1a3a0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1a3b0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1a3c0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1a3d0 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1a3e0 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1a3f0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1a400 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1a410 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1a420 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1a430 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1a440 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1a450 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1a460 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1a470 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1a480 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1a490 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a4a0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1a4b0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1a4c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1a4d0 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1a4e0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1a4f0 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1a500 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   && pBt->readOnl
1a510 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
1a520 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1a530 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1a540 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61  le==1 && pagerPa
1a550 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1a560 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a570 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a  LITE_EMPTY;.  }.
1a580 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1a590 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1a5a0 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1a5b0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1a5c0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1a5d0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1a5e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1a5f0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1a600 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1a610 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1a620 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1a630 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1a640 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1a650 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1a660 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1a670 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1a680 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1a690 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1a6a0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1a6b0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1a6c0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1a6d0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1a6e0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1a6f0 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1a700 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1a710 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1a720 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1a730 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1a740 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1a750 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1a760 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1a770 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1a7b0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a7e0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1a7f0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1a800 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a830 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1a840 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1a850 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1a860 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1a870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1a880 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1a890 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1a8a0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1a8d0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1a8e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1a8f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a900 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1a910 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1a920 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1a930 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1a940 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1a950 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1a960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a970 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1a980 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1a990 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1a9a0 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1a9b0 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1a9c0 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1a9d0 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1a9e0 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1a9f0 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1aa00 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1aa10 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1aa20 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1aa30 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1aa40 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1aa50 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1aa60 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1aa70 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1aa80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1aa90 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1aaa0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1aab0 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72   sizeof(BtCursor
1aac0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1aad0 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1aae0 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
1aaf0 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61  cursor in the sa
1ab00 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
1ab10 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20  .** as pCur and 
1ab20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20  having the same 
1ab30 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
1ab40 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76   as pCur.  The v
1ab50 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
1ab60 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  o iRowid..**.** 
1ab70 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f  Only positive ro
1ab80 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63  wid values are c
1ab90 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20  onsidered valid 
1aba0 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a  for this cache..
1abb0 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20  ** The cache is 
1abc0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
1abd0 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ero, indicating 
1abe0 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65  an invalid cache
1abf0 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c  ..** A btree wil
1ac00 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68  l work fine with
1ac10 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1ac20 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75  e rowids.  We ju
1ac30 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63  st cannot.** cac
1ac40 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  he zero or negat
1ac50 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63  ive rowids, whic
1ac60 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74  h means tables t
1ac70 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a  hat use zero or.
1ac80 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  ** negative rowi
1ac90 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ds might run a l
1aca0 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42  ittle slower.  B
1acb0 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ut in practice, 
1acc0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74  zero.** or negat
1acd0 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76  ive rowids are v
1ace0 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20  ery uncommon so 
1acf0 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  this should not 
1ad00 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
1ad10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1ad20 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeSetCachedRowid
1ad30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1ad40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1ad50 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73  Rowid){.  BtCurs
1ad60 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ad70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  Cur->pBt->pCurso
1ad80 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1ad90 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  ){.    if( p->pg
1ada0 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67  noRoot==pCur->pg
1adb0 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68  noRoot ) p->cach
1adc0 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  edRowid = iRowid
1add0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ade0 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1adf0 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a  d==iRowid );.}..
1ae00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ae10 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f   cached rowid fo
1ae20 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
1ae30 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  or.  A negative 
1ae40 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72  or zero.** retur
1ae50 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1ae60 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  s that the rowid
1ae70 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69   cache is invali
1ae80 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a  d and should be.
1ae90 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  ** ignored.  If 
1aea0 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1aeb0 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1aec0 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20   been set, then 
1aed0 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74  a.** zero is ret
1aee0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  urned..*/.sqlite
1aef0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42  3_int64 sqlite3B
1af00 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77  treeGetCachedRow
1af10 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1af20 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1af30 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a  r->cachedRowid;.
1af40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1af50 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
1af60 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1af70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1af80 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
1af90 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
1afa0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
1afb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1afc0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
1afd0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
1afe0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
1aff0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
1b000 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1b010 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
1b020 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b030 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1b040 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1b050 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
1b060 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1b070 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
1b080 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
1b090 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
1b0a0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
1b0b0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
1b0c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
1b0d0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
1b0e0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
1b0f0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1b100 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
1b110 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1b120 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
1b130 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1b140 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1b150 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1b160 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1b170 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
1b180 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1b190 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
1b1a0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1b1b0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
1b1c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1b1d0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1b1e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b1f0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1b200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1b220 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1b230 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1b240 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1b250 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1b260 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1b270 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1b280 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1b290 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1b2a0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1b2b0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1b2c0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1b2d0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1b2e0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1b2f0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1b300 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1b310 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1b320 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1b330 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1b340 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1b350 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1b360 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1b370 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1b380 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1b390 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1b3a0 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1b3b0 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1b3c0 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1b3d0 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1b3e0 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1b3f0 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1b400 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1b410 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1b420 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1b430 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1b440 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1b450 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1b460 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1b470 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
1b480 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
1b490 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
1b4a0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
1b4b0 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
1b4c0 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
1b4d0 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
1b4e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1b4f0 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
1b500 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
1b510 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b520 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
1b530 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
1b540 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1b550 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
1b560 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
1b570 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
1b580 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1b590 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
1b5a0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1b5b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
1b5c0 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
1b5d0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
1b5e0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
1b5f0 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
1b600 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
1b610 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
1b620 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
1b630 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
1b640 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
1b650 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
1b660 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
1b670 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
1b680 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
1b690 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1b6a0 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
1b6b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1b6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1b6d0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1b6e0 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65  age;.      btree
1b6f0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1b700 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1b710 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1b720 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
1b730 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
1b740 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
1b750 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1b760 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1b770 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
1b780 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
1b790 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
1b7a0 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
1b7b0 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
1b7c0 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
1b7d0 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
1b7e0 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
1b7f0 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
1b840 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
1b890 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61     \.    btreePa
1b8e0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1b8f0 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1b900 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1b910 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20  pCur->info); \. 
1b920 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1b930 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ey = 1;         
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1b970 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1b9c0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
1b9d0 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
1ba20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a  _MSC_VER */../*.
1ba30 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1ba40 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1ba50 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
1ba60 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
1ba70 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
1ba80 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
1ba90 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
1baa0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1bab0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
1bac0 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
1bad0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
1bae0 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
1baf0 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
1bb00 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
1bb10 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1bb20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
1bb30 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
1bb40 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
1bb50 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
1bb60 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1bb70 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1bb80 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1bb90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1bba0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1bbb0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1bbc0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1bbd0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1bbe0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bbf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1bc00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1bc10 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1bc20 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1bc30 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1bc40 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1bc50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1bc60 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
1bc70 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
1bc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
1bc90 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1bca0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1bcb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1bcc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1bcd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bce0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1bcf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1bd00 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
1bd10 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
1bd20 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
1bd30 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
1bd40 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
1bd50 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
1bd60 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
1bd70 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
1bd80 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
1bd90 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
1bda0 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
1bdb0 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
1bdc0 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
1bdd0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
1bde0 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
1bdf0 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
1be00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1be10 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
1be20 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
1be30 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1be40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1be50 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1be60 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1be70 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1be80 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1be90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bea0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( 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 7c 7c 20 70 43  OR_INVALID || pC
1bed0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1bee0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1bef0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1bf00 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bf10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
1bf20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
1bf30 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74  alid entry - set
1bf40 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f   *pSize to 0. */
1bf50 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1bf60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1bf70 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1bf80 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
1bf90 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1bfa0 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  .nData;.    }.  
1bfb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1bfc0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1bfd0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1bfe0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1bff0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1c000 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
1c010 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
1c020 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
1c030 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1c040 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1c050 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
1c060 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
1c070 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
1c080 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
1c090 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
1c0a0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
1c0b0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
1c0c0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
1c0d0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
1c0e0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
1c0f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
1c100 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1c110 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1c120 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
1c130 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1c140 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
1c150 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1c160 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
1c170 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
1c180 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
1c190 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
1c1a0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
1c1b0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
1c1c0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
1c1d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
1c1e0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
1c1f0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
1c200 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1c210 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
1c220 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
1c230 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
1c240 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
1c250 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
1c260 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
1c270 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
1c280 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
1c290 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1c2a0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1c2b0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
1c2c0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
1c2d0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
1c2e0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
1c2f0 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
1c300 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
1c310 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
1c320 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
1c330 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
1c340 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
1c350 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
1c360 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
1c370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c380 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1c390 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c3a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c3b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1c3c0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
1c3d0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
1c3e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1c3f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1c400 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
1c410 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
1c420 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1c430 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
1c440 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
1c450 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
1c460 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
1c470 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
1c480 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1c490 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
1c4a0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
1c4b0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
1c4c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c4d0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1c4e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c4f0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1c500 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
1c510 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
1c520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1c530 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
1c540 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
1c550 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1c560 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
1c570 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
1c580 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
1c590 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
1c5a0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
1c5b0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
1c5c0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
1c5d0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
1c5e0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
1c5f0 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
1c600 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
1c610 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
1c620 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
1c630 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
1c640 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
1c650 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
1c660 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
1c670 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1c680 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1c690 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
1c6a0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
1c6b0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
1c6c0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
1c6d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1c6e0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
1c6f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1c700 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1c710 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
1c720 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
1c730 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  s<=pagerPagecoun
1c740 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
1c750 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1c760 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
1c770 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
1c780 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c790 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
1c7a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
1c7b0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
1c7c0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
1c7d0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
1c7e0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1c7f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c800 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
1c810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c820 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1c830 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1c840 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
1c850 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51     assert(rc==SQ
1c860 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c870 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ==0);.    if( ne
1c880 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  xt==0 && rc==SQL
1c890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c8a0 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
1c8b0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1c8c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
1c8d0 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
1c8e0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
1c8f0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
1c900 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
1c910 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1c920 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1c930 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
1c940 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
1c950 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
1c960 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
1c970 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
1c980 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
1c990 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
1c9a0 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
1c9b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1c9c0 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
1c9d0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1c9e0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
1c9f0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
1ca00 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
1ca10 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1ca20 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
1ca30 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
1ca40 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
1ca50 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
1ca60 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
1ca70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ca80 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1ca90 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
1caa0 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
1cab0 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
1cac0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1cad0 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
1cae0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1caf0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1cb00 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
1cb10 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
1cb20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1cb30 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
1cb40 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
1cb50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1cb60 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
1cb70 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
1cba0 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
1cbb0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1cbc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1cbd0 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
1cbe0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc00 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
1cc10 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
1cc20 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
1cc30 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
1cc40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
1cc50 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
1cc60 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
1cc70 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
1cc80 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
1cc90 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
1cca0 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
1ccb0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
1ccc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ccd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1cce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ccf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cd00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
1cd10 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
1cd20 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
1cd30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
1cd40 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
1cd50 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
1cd60 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
1cd70 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
1cd80 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
1cd90 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1cda0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1cdb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cdc0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
1cdd0 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
1cde0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1cdf0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
1ce00 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
1ce10 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1ce20 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
1ce30 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
1ce40 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
1ce50 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1ce60 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
1ce70 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
1ce80 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
1ce90 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
1cea0 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
1ceb0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1cec0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
1ced0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
1cee0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
1cef0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
1cf00 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
1cf10 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
1cf20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
1cf30 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
1cf40 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
1cf50 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
1cf60 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
1cf70 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
1cf80 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
1cf90 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
1cfa0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
1cfb0 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
1cfc0 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
1cfd0 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
1cfe0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1cff0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1d000 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
1d010 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
1d020 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
1d030 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1d040 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
1d050 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
1d060 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
1d070 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
1d080 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
1d090 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
1d0a0 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
1d0b0 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
1d0c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1d0d0 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
1d0e0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
1d0f0 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
1d100 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
1d110 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
1d120 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
1d130 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
1d140 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
1d150 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
1d160 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1d170 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1d180 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1d190 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
1d1a0 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
1d1b0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
1d1c0 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
1d1d0 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
1d1e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
1d1f0 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
1d200 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
1d210 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
1d220 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
1d230 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
1d240 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
1d250 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
1d260 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
1d270 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
1d280 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
1d290 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
1d2a0 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
1d2b0 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
1d2c0 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
1d2d0 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
1d2e0 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
1d2f0 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
1d300 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
1d310 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1d320 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1d330 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1d340 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1d350 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
1d360 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
1d370 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
1d380 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
1d390 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
1d3a0 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
1d3b0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
1d3c0 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
1d3d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d3e0 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
1d3f0 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
1d400 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
1d410 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
1d420 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
1d430 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
1d440 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
1d450 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1d460 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1d470 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1d480 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1d490 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1d4a0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1d4b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d4c0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1d4d0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1d4e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1d4f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1d500 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1d510 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1d520 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1d530 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d540 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d560 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1d570 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1d580 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d5a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d5b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1d5c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1d5d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1d5e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1d5f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d600 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d610 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1d620 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1d630 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1d640 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1d650 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1d660 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1d670 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1d680 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
1d690 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  ;..  if( skipKey
1d6a0 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
1d6b0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
1d6c0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
1d6d0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1d6e0 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61  Data .   || &aPa
1d6f0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1d700 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
1d710 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
1d720 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
1d730 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
1d740 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
1d750 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1d760 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
1d770 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
1d780 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d790 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1d7a0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
1d7b0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
1d7c0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
1d7d0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
1d7e0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
1d7f0 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
1d800 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
1d810 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
1d820 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
1d830 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1d840 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
1d850 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
1d860 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
1d870 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1d880 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
1d890 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1d8a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1d8b0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
1d8c0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
1d8d0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1d8e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
1d8f0 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
1d900 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
1d910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d920 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1d930 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
1d940 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1d950 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
1d960 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
1d970 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
1d980 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
1d990 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
1d9a0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
1d9b0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1d9c0 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
1d9d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1d9e0 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
1d9f0 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
1da00 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1da10 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
1da20 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
1da30 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
1da40 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
1da50 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
1da60 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
1da70 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
1da80 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
1da90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1daa0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
1dab0 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
1dac0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1dad0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1dae0 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
1daf0 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
1db00 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
1db10 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
1db20 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
1db30 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
1db40 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
1db50 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
1db60 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
1db70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1db80 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
1db90 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
1dba0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1dbb0 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
1dbc0 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
1dbd0 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
1dbe0 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
1dbf0 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
1dc00 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1dc10 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
1dc20 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
1dc30 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
1dc40 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  l);.      if( nO
1dc50 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  vfl && !pCur->aO
1dc60 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1dc70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1dc80 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
1dc90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1dca0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1dcb0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1dcc0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
1dcd0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
1dce0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1dcf0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
1dd00 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
1dd10 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
1dd20 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
1dd30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1dd40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1dd50 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1dd60 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
1dd70 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
1dd80 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
1dd90 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
1dda0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1ddb0 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
1ddc0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
1ddd0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
1dde0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1ddf0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
1de00 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
1de10 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
1de20 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
1de30 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1de40 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
1de50 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
1de60 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1de70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
1de80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
1de90 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1dea0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1deb0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1dec0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
1ded0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
1dee0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1def0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1df00 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
1df10 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
1df20 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1df30 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1df40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1df50 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1df60 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1df70 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1df80 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1df90 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1dfa0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1dfb0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1dfc0 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1dfd0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1dfe0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1dff0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1e000 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1e010 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1e020 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1e030 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1e040 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1e050 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1e060 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1e070 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1e080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1e090 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1e0a0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1e0b0 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1e0c0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1e0d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1e0e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1e0f0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1e100 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
1e110 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1e120 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
1e130 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
1e140 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
1e150 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
1e160 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
1e170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e180 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
1e190 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
1e1a0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
1e1b0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
1e1c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
1e1d0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
1e1e0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
1e1f0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
1e200 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
1e210 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
1e220 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
1e230 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
1e240 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
1e250 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1e260 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
1e270 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
1e280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1e290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e2a0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
1e2b0 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
1e2c0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1e2d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
1e2e0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1e2f0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
1e300 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
1e310 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
1e320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1e330 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
1e340 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
1e350 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1e360 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1e370 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
1e380 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1e390 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e3a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e3b0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1e3c0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
1e3d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e3e0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
1e3f0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1e400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e430 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1e440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e450 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1e460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e470 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1e480 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
1e490 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1e4a0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1e4b0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1e4c0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1e4d0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1e4e0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1e4f0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1e500 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1e510 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e520 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1e530 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1e540 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1e550 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1e560 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1e570 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1e580 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1e590 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1e5a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e5b0 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
1e5c0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1e5d0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1e5e0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1e5f0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e600 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e610 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1e620 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1e630 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1e640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e650 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1e660 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e670 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1e680 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e690 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1e6a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e6b0 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66  iPage] );.    if
1e6c0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
1e6d0 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
1e6e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e6f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e700 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1e710 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e720 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1e730 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e740 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1e750 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
1e760 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
1e770 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
1e780 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
1e790 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1e7a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e7b0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1e7c0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1e7d0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1e7e0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1e7f0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1e800 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1e810 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1e820 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1e830 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1e840 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1e850 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1e860 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1e870 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1e880 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1e890 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e8a0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1e8b0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1e8c0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1e8d0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1e8e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1e8f0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
1e900 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1e910 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1e920 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1e930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e940 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e950 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
1e960 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1e970 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1e980 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
1e990 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1e9a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e9b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e9c0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1e9d0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1e9e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e9f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1ea00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1ea10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1ea20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ea30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1ea40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ea50 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1ea60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ea70 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ea80 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1ea90 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1eaa0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1eab0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1eac0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1ead0 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
1eae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1eaf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1eb00 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
1eb10 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
1eb20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
1eb30 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
1eb40 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1eb50 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
1eb60 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
1eb70 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
1eb80 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
1eb90 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
1eba0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
1ebb0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
1ebc0 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
1ebd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1ebe0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
1ebf0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
1ec00 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
1ec10 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
1ec20 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1ec30 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
1ec40 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
1ec50 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
1ec60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ec70 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1ec80 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
1ec90 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
1eca0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
1ecb0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
1ecc0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
1ecd0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
1ece0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
1ecf0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
1ed00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1ed10 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
1ed20 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
1ed30 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
1ed40 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
1ed50 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
1ed60 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
1ed70 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
1ed80 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
1ed90 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
1eda0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
1edb0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
1edc0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
1edd0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
1ede0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
1edf0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1ee00 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
1ee10 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
1ee20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1ee30 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
1ee40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ee50 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
1ee60 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
1ee70 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
1ee80 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
1ee90 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1eea0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1eeb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
1eec0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
1eed0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1eee0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1eef0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1ef00 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1ef10 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
1ef20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1ef30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1ef40 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
1ef50 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
1ef60 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
1ef70 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
1ef80 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1ef90 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
1efa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1efb0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
1efc0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
1efd0 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
1efe0 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
1eff0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
1f000 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1f010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f020 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
1f030 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f040 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f050 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f060 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f070 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1f080 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f090 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1f0a0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f0b0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1f0c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
1f0d0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1f0e0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1f0f0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
1f100 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
1f110 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1f120 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1f130 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
1f140 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1f150 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70     nKey = (int)p
1f160 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1f170 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
1f180 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
1f190 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
1f1a0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1f1b0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
1f1c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1f1d0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1f1e0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
1f1f0 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
1f200 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
1f210 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
1f220 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
1f230 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
1f240 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
1f250 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
1f260 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
1f270 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
1f280 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
1f290 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
1f2a0 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
1f2b0 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
1f2c0 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
1f2d0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
1f2e0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1f2f0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
1f300 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
1f310 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1f320 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
1f330 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
1f340 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
1f350 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
1f360 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
1f370 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
1f380 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
1f390 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
1f3a0 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
1f3b0 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
1f3c0 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
1f3d0 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
1f3e0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
1f3f0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
1f400 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1f410 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1f420 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
1f430 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
1f440 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
1f450 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
1f460 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
1f470 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1f480 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
1f490 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1f4a0 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
1f4b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1f4c0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1f4d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f4e0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1f4f0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1f500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1f510 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f520 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1f530 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f540 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1f550 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1f560 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1f570 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1f580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f590 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1f5a0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1f5b0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1f5c0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1f5d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f5e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f5f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f600 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f610 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f620 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1f630 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1f640 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1f650 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1f660 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1f670 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1f680 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
1f690 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
1f6a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1f6b0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
1f6c0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
1f6d0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
1f6e0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
1f6f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
1f700 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
1f710 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
1f720 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
1f730 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f740 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
1f750 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
1f760 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
1f770 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
1f780 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1f790 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
1f7a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f7b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f7c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f7d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f7e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1f7f0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1f800 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
1f810 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
1f820 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
1f830 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
1f840 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1f850 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f860 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
1f870 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1f880 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
1f890 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
1f8a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f8b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
1f8c0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
1f8d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
1f8e0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
1f8f0 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
1f900 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1f910 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1f920 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
1f930 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
1f940 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1f950 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f960 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1f970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1f980 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1f990 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
1f9a0 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
1f9b0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
1f9c0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1f9d0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
1f9e0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1f9f0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
1fa00 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
1fa10 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
1fa20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
1fa30 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
1fa40 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
1fa50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
1fa60 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
1fa70 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
1fa80 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1fa90 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
1faa0 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
1fab0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1fac0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
1fad0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
1fae0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
1faf0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
1fb00 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
1fb10 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
1fb20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
1fb30 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
1fb40 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
1fb50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
1fb60 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
1fb70 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
1fb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1fb90 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
1fba0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
1fbb0 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
1fbc0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
1fbd0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
1fbe0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
1fbf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1fc00 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1fc10 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1fc20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1fc30 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1fc40 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1fc50 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1fc60 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1fc70 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1fc80 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1fc90 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1fca0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1fcb0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1fcc0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1fcd0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1fce0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1fcf0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1fd00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fd10 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
1fd20 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1fd30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1fd40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fd50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1fd60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1fd70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1fd80 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1fd90 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1fda0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fdb0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
1fdc0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1fdd0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
1fde0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
1fdf0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
1fe00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
1fe10 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1fe20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1fe30 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
1fe40 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1fe50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fe60 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
1fe70 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
1fe80 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1fe90 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1fea0 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
1feb0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1fec0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1fed0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1fee0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1fef0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1ff00 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1ff10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ff20 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
1ff30 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1ff40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ff50 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
1ff60 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ff70 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1ff80 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
1ff90 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
1ffa0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1ffb0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1ffc0 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
1ffd0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1ffe0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1fff0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
20000 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
20010 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
20020 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
20030 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
20040 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
20050 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
20060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
20070 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
20080 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20090 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
200a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
200b0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
200c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
200d0 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d  or(i=1; i<=pCur-
200e0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
200f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20100 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
20110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
20120 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  ->iPage = 0;.  }
20130 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
20140 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
20150 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
20160 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
20170 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
20180 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20  >apPage[0])).   
20190 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
201a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
201b0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
201c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
201d0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
201e0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
201f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
20200 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
20210 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
20220 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
20230 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
20240 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
20250 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
20260 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
20270 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
20280 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
20290 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
202a0 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
202b0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
202c0 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
202d0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
202e0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
202f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
20300 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
20310 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
20320 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
20330 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
20340 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
20350 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
20360 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
20370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20390 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
203a0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
203b0 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
203c0 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
203d0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
203e0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
203f0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
20400 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
20410 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
20420 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
20430 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
20440 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
20450 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
20460 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
20470 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
20480 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
20490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
204a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
204b0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
204c0 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
204d0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
204e0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
204f0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
20500 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
20510 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
20520 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
20530 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
20540 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
20550 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
20560 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
20570 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
20580 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
20590 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
205a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
205b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
205c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
205d0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
205e0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
205f0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
20600 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
20610 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
20620 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
20630 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
20640 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
20650 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
20660 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
20670 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
20680 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
20690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
206a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
206b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
206c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
206d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
206e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
206f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
20700 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20710 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20720 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20730 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20740 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20750 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
20760 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20770 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
20780 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
20790 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
207a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
207b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
207c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
207d0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
207e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
207f0 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
20800 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
20810 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
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 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
20860 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
20870 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page 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 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
208b0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
208c0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
208d0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
208e0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
208f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
20900 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
20910 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
20920 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
20930 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
20940 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
20950 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
20960 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
20970 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
20980 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
20990 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
209a0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
209b0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
209c0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
209d0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
209e0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
209f0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
20a00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
20a10 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
20a20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20a30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
20a40 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
20a50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
20a60 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
20a70 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20a80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20a90 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
20aa0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
20ab0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
20ac0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
20ad0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
20ae0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
20af0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
20b00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
20b10 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
20b20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
20b30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
20b40 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
20b50 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
20b60 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
20b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
20b80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20b90 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
20ba0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
20bb0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
20bc0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
20bd0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
20be0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20bf0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
20c00 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
20c10 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
20c20 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
20c30 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
20c40 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
20c50 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
20c60 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
20c70 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
20c80 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
20c90 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
20ca0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
20cb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20cc0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
20cd0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
20ce0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
20cf0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20d00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20d10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20d20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
20d30 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
20d40 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
20d50 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
20d60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20d70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
20d80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20d90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
20da0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20db0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20dc0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
20dd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
20de0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
20df0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
20e10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
20e20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20e30 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
20e40 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
20e50 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
20e60 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
20e70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20e80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
20e90 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
20ea0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
20eb0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
20ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
20ed0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
20ee0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
20ef0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
20f00 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
20f10 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
20f20 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
20f30 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
20f40 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
20f50 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
20f60 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
20f70 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
20f80 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
20f90 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20fa0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20fc0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
20fd0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
20fe0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
20ff0 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
21000 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
21010 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
21020 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
21030 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
21040 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
21050 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
21060 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
21070 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
21080 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
21090 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
210a0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
210b0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
210c0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
210d0 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
210e0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
210f0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
21100 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
21110 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
21120 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21130 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
21140 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
21150 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21160 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21170 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
21180 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21190 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
211a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
211b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
211c0 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
211d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
211e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
211f0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
21200 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
21210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21220 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
21230 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
21240 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
21250 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21260 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21270 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
21280 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
21290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
212a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
212b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
212c0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
212d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
212e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
212f0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
21300 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
21310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
21320 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
21330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21340 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
21350 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
21360 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
21370 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
21380 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
21390 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
213a0 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
213b0 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
213c0 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
213d0 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
213e0 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
213f0 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
21400 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
21410 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
21420 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
21430 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
21440 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
21450 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
21460 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
21470 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
21480 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
21490 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
214a0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
214b0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
214c0 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
214d0 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
214e0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
214f0 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
21500 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
21510 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
21520 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
21530 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
21540 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
21550 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
21560 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
21570 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
21580 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
21590 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
215a0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
215b0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
215c0 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
215d0 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
215e0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
215f0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
21600 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
21610 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
21620 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
21630 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
21640 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
21650 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
21660 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
21670 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
216a0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
216b0 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
216c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
216d0 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
216e0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
216f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
21700 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
21720 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
21730 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
21740 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
21750 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
21760 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21770 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
21780 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21790 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
217a0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
217b0 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
217c0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
217d0 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
217e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
217f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
21800 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
21810 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21820 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
21830 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
21840 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
21850 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
21860 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
21870 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
21880 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
21890 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
218a0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
218b0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
218c0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
218d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
218e0 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
218f0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
21900 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
21910 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21920 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21930 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21940 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
21950 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
21960 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21970 52 65 73 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Res );..  /* If 
21980 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
21990 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
219a0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
219b0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
219c0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
219d0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
219e0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
219f0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
21a00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21a10 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
21a20 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
21a30 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
21a40 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
21a50 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
21a60 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
21a70 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
21a80 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
21a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
21aa0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
21ab0 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
21ac0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
21ad0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
21ae0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
21af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21b00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
21b10 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
21b20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
21b30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21b40 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
21b50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21b60 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
21b70 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21b80 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
21b90 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43  Init );.  if( pC
21ba0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21bb0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
21bc0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
21bd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21be0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21bf0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
21c00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21c10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
21c20 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21c30 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
21c40 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
21c50 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
21c60 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
21c70 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
21c80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
21c90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21ca0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
21cb0 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65   c = -1;  /* pRe
21cc0 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c  s return if tabl
21cd0 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20  e is empty must 
21ce0 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72  be -1 */.    lwr
21cf0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
21d00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
21d10 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 2d      if( (!pPage-
21d20 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78 4b  >intKey && pIdxK
21d30 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20  ey==0) || upr<0 
21d40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
21d50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21d60 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
21d70 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
21d80 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
21d90 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
21da0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21db0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70  iPage] = (u16)up
21dc0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
21dd0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
21de0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
21df0 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32  u16)((upr+lwr)/2
21e00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
21e10 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  (;;){.      int 
21e20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
21e30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  x[pCur->iPage]; 
21e40 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72  /* Index of curr
21e50 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
21e60 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70  e */.      u8 *p
21e70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
21ea0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
21eb0 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75  ge */..      pCu
21ec0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
21ed0 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  0;.      pCell =
21ee0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
21ef0 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
21f00 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
21f10 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
21f20 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
21f30 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
21f40 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
21f50 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
21f60 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b        u32 dummy;
21f70 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
21f80 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
21f90 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20  pCell, dummy);. 
21fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21fb0 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
21fc0 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
21fd0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
21fe0 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
21ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
22000 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
22010 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
22020 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22030 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
22040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22050 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
22060 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a  llKey>intKey );.
22070 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
22080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22090 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
220a0 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Key = 1;.       
220b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
220c0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
220d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
220e0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
220f0 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
22100 73 69 7a 65 20 69 73 20 33 32 37 36 38 20 62 79  size is 32768 by
22110 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
22120 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
22130 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
22140 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
22150 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
22160 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
22170 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
22180 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62 79 74  at most 8198 byt
22190 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65  es, which may be
221a0 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
221b0 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
221c0 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
221d0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
221e0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
221f0 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
22200 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
22210 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
22220 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
22230 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
22240 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
22250 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
22260 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
22270 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
22280 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
22290 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
222a0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
222b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
222c0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d       int nCell =
222d0 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
222e0 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26     if( !(nCell &
222f0 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c   0x80) && nCell<
22300 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
22310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
22320 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
22330 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
22340 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
22350 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
22360 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
22370 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
22380 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
22390 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
223a0 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
223b0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
223c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  */.          c =
223d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
223e0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
223f0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
22400 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
22410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
22420 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
22430 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
22440 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
22450 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
22460 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
22470 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
22480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
22490 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
224a0 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
224b0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
224c0 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
224d0 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
224e0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
224f0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
22500 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
22510 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22520 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
22530 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
22540 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
22550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22560 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
22570 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
22580 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
22590 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
225a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
225b0 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
225c0 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
225d0 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
225e0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
225f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
22600 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
22610 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
22620 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
22630 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
22640 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
22650 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22660 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
22670 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76  . */.          v
22680 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
22690 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
226a0 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
226b0 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
226c0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
226d0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
226e0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
226f0 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
22700 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
22710 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
22720 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
22730 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
22740 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
22750 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20  loc( nCell );.  
22760 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
22770 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
22780 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22790 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
227a0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
227b0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
227c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
227d0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
227e0 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
227f0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
22800 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 2c 20  r*)pCellKey, 0, 
22810 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  0);.          c 
22820 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
22830 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
22840 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
22850 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
22860 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
22870 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
22880 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
22890 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
228a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
228b0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
228c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
228d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
228e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
228f0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
22900 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
22910 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
22920 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22930 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22940 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
22950 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
22960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22970 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
22980 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
22990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
229a0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
229b0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
229c0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
229d0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
229e0 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
229f0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
22a00 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
22a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
22a20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22a30 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
22a40 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20  (lwr+upr)/2);.  
22a50 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22a60 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
22a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22a80 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
22a90 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
22aa0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
22ab0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
22ac0 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
22ad0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
22ae0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
22af0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
22b00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
22b10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22b20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
22b30 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
22b40 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
22b50 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
22b60 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
22b70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22b80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
22b90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22ba0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
22bb0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
22bc0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
22bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
22be0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
22bf0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
22c00 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22c10 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
22c20 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
22c30 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
22c40 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22c50 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
22c60 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
22c70 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
22c80 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
22c90 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
22ca0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
22cb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
22cc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
22cd0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
22ce0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
22cf0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
22d00 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
22d10 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
22d20 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
22d30 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
22d40 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
22d50 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
22d60 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
22d70 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
22d80 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
22d90 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
22da0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
22db0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
22dc0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
22dd0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
22de0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
22df0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
22e00 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
22e10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
22e20 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
22e30 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
22e40 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
22e50 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
22e60 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
22e70 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
22e80 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
22e90 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
22ea0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
22eb0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
22ec0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
22ed0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
22ee0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
22ef0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
22f00 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
22f10 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
22f20 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
22f30 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
22f40 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
22f50 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
22f60 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
22f70 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
22f80 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
22f90 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
22fa0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
22fb0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
22fc0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
22fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22fe0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
22ff0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
23000 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
23010 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
23020 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
23030 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23040 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23050 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
23060 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
23070 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23090 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
230a0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
230b0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
230c0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
230d0 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
230e0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
230f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23100 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
23110 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
23120 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
23130 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
23140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23150 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
23160 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
23170 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23180 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
23190 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
231a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
231b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
231c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
231d0 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e  rt( idx<=pPage->
231e0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
231f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23200 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23210 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
23220 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
23230 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
23240 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
23250 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23260 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
23270 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
23280 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23290 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
232a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
232b0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
232c0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
232d0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
232e0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
232f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
23300 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
23310 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
23320 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23330 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
23340 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
23350 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
23360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23380 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
23390 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
233a0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
233b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
233c0 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
233d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
233e0 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
233f0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
23400 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
23410 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
23420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23430 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
23440 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
23450 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23460 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
23470 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23480 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
23490 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
234a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
234b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
234c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
234d0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
234e0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
234f0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
23500 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
23510 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
23520 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
23530 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
23540 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
23550 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
23560 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
23570 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
23580 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
23590 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
235a0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
235b0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
235c0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
235d0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
235e0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
235f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23600 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
23610 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
23620 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
23630 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23640 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
23650 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
23660 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
23670 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
23690 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
236a0 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
236b0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
236c0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
236d0 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
236e0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
236f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
23700 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30  if( pCur->skip<0
23710 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
23720 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
23730 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
23740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
23750 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
23760 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
23770 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23780 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
23790 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
237a0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
237b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
237c0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
237d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
237e0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
237f0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
23800 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
23810 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
23820 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23840 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
23850 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
23860 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23870 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
23880 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
23890 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
238a0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
238b0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
238c0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
238d0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
238e0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
238f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23900 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
23910 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
23920 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
23930 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23940 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
23950 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23960 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
23970 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
23980 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
23990 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
239a0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
239b0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
239c0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
239d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
239e0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
239f0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
23a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23a20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
23a30 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
23a40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
23a50 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
23a60 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
23a70 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
23a80 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
23a90 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
23aa0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
23ab0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
23ac0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
23ad0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
23ae0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
23af0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
23b00 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
23b10 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
23b20 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
23b30 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
23b40 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
23b50 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
23b60 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
23b70 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
23b80 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
23b90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
23ba0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
23bb0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
23bc0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
23bd0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
23be0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
23bf0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
23c00 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
23c10 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
23c20 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
23c30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
23c40 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
23c50 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
23c60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23c70 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
23c80 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
23c90 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
23ca0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
23cb0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
23cc0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
23cd0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
23ce0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
23cf0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
23d00 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
23d10 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
23d20 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
23d30 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
23d40 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
23d50 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
23d60 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
23d70 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
23d80 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
23d90 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
23da0 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
23db0 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
23dc0 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
23dd0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
23de0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
23df0 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
23e00 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
23e10 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
23e20 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
23e30 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
23e40 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
23e50 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
23e60 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
23e70 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
23e80 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
23e90 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
23ea0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
23eb0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
23ec0 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
23ed0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
23ee0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
23ef0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23f00 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
23f10 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
23f20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
23f30 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
23f40 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
23f50 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
23f60 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
23f70 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
23f80 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
23f90 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
23fa0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
23fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23fc0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
23fd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23fe0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
23ff0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
24000 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
24010 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
24020 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
24030 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
24040 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
24050 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
24060 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
24070 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
24080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24090 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
240a0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
240b0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
240c0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
240d0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
240e0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
240f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
24100 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
24110 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
24120 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
24130 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
24140 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
24150 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
24160 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
24170 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
24180 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
24190 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
241a0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
241b0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
241c0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
241d0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
241e0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
241f0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
24200 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
24210 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
24220 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
24230 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24240 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
24250 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61   && nearby<=mxPa
24260 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ge ){.      u8 e
24270 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
24280 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
24290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
242a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
242b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
242c0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
242d0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
242e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
242f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
24300 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
24310 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
24320 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
24330 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
24340 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
24350 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
24360 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
24370 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
24380 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
24390 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
243a0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
243b0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
243c0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
243d0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
243e0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
243f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24400 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
24410 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
24420 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
24430 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
24440 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
24450 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
24460 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
24470 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
24480 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
24490 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
244a0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
244b0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
244c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
244d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
244e0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
244f0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
24500 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
24510 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
24520 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
24530 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
24540 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
24550 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
24560 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
24570 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
24580 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
24590 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
245a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
245b0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
245c0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
245d0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
245e0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
245f0 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
24600 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
24610 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
24620 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24630 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24640 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24650 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24660 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
24670 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
24680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24690 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
246a0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
246b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
246c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
246d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
246e0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
246f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
24700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6b 3d      testcase( k=
24710 3d 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  =(u32)(pBt->usab
24720 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 3b  leSize/4 - 2) );
24730 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
24740 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
24750 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
24760 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
24770 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
24780 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
24790 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
247a0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
247b0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
247c0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
247d0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
247e0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
247f0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
24800 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
24810 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
24820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24830 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
24840 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
24850 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24860 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24870 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24890 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
248a0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
248b0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
248c0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
248d0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
248e0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
248f0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
24900 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
24910 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
24920 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
24930 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
24940 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
24950 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
24960 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
24970 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
24980 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
24990 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
249a0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
249b0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
249c0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
249d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
249e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
249f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
24a00 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
24a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
24a20 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
24a30 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
24a40 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
24a50 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
24a60 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
24a70 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
24a80 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
24a90 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
24aa0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
24ab0 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
24ac0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
24ad0 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
24ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24af0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
24b00 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
24b10 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
24b20 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
24b30 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
24b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24b50 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
24b60 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
24b70 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
24b80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24b90 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
24ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24bb0 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
24bc0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
24bd0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
24be0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
24bf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
24c00 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
24c10 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
24c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24c30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
24c40 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
24c50 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
24c60 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
24c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24c90 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
24ca0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
24cb0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
24cc0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
24cd0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
24ce0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
24cf0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
24d00 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
24d10 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
24d20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
24d30 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
24d40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
24d50 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
24d60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
24d70 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
24d80 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
24d90 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
24da0 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
24db0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
24dc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
24dd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24de0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
24df0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
24e00 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
24e10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
24e20 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
24e30 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
24e40 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
24e50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
24e60 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
24e70 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
24e80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24ea0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
24eb0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
24ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24ee0 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
24ef0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
24f00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24f20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
24f30 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
24f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
24f50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
24f60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
24f70 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
24f80 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
24f90 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
24fa0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
24fb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
24fc0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
24fd0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
24fe0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
24ff0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
25000 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
25010 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
25020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
25030 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
25040 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
25050 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
25060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
25070 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
25080 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
25090 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
250a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
250b0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
250c0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
250d0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
250e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
250f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25100 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
25110 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25130 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
25140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25150 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25170 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
25180 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
25190 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
251a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
251b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
251c0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
251d0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
251e0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
251f0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
25200 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
25210 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
25220 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
25230 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
25240 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
25250 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
25260 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
25270 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
25280 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
25290 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
252a0 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
252b0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
252c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
252d0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
252e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
252f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25300 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25310 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25330 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
25340 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
25350 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64  .          int d
25360 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
25370 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
25380 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
25390 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
253a0 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
253b0 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
253c0 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
253d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
253e0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
253f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
25400 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
25410 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
25420 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
25430 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
25440 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
25450 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
25460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
25470 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
25480 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
25490 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
254a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
254b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
254c0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
254d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
254e0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
254f0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
25500 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
25510 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25520 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
25530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
25540 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
25550 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25560 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25570 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25580 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25590 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
255a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
255b0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
255c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
255d0 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
255e0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
255f0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
25600 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
25610 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
25620 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
25630 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
25640 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
25650 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25670 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
25680 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
25690 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
256a0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
256b0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
256c0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
256d0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
256e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
256f0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
25700 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
25710 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
25720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25730 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
25740 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
25750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
25760 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25770 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
25780 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
25790 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
257a0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
257b0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
257c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
257d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
257e0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
257f0 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
25800 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25820 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25830 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25840 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
25850 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
25860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25880 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25890 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
258a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
258b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
258c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
258d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
258e0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
258f0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
25900 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
25910 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
25920 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
25930 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25940 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
25950 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
25960 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
25970 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
25980 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
25990 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
259a0 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
259b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
259c0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
259d0 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28  ge + 1;..    if(
259e0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
259f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
25a00 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  ){.      (*pPgno
25a10 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  )++;.    }..#ifn
25a20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25a30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
25a40 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
25a50 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
25a60 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
25a70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25a80 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
25a90 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
25aa0 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
25ab0 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
25ac0 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
25ad0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
25ae0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
25af0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
25b00 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
25b10 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
25b20 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
25b30 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
25b40 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
25b50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
25b60 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
25b70 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
25b80 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
25b90 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
25ba0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
25bb0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
25bc0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
25bd0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
25be0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
25bf0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
25c00 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
25c10 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  o, &pPg, 0);.   
25c20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25c40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25c50 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
25c60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
25c70 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
25c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25c90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25ca0 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
25cb0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
25cc0 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
25cd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
25ce0 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
25cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
25d00 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
25d10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
25d20 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
25d30 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
25d40 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
25d50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
25d60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25d70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25d80 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
25d90 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
25da0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25dc0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
25dd0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
25de0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
25df0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
25e00 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
25e10 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
25e20 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
25e30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
25e40 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
25e50 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
25e60 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
25e70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
25e80 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
25e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25ea0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
25eb0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
25ec0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
25ed0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
25ee0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
25ef0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
25f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25f10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
25f20 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
25f30 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
25f40 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
25f50 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
25f60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
25f70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25f80 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
25f90 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
25fa0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
25fb0 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
25fc0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
25fd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
25fe0 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
25ff0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
26000 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
26010 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
26020 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
26030 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26040 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
26050 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
26060 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
26070 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
26080 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
26090 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
260a0 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
260b0 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
260c0 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
260d0 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
260e0 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
260f0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
26100 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
26110 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
26120 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
26130 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
26140 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
26150 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
26160 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
26170 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
26180 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
26190 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
261a0 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
261b0 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
261c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
261d0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
261e0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
261f0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
26200 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
26210 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26220 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
26230 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
26240 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
26250 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
26260 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
26270 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
26280 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
26290 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
262a0 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262c0 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
262d0 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
262e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
26310 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
26320 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
26350 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
26360 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
26370 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26380 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
26390 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
263a0 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
263b0 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
263c0 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
263d0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
263e0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
263f0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
26400 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
26410 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
26420 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
26430 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
26440 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
26450 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
26460 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
26470 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
26480 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
26490 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
264a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
264b0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
264c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
264d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
264e0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
264f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
26500 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
26510 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
26520 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69  ], nFree+1);..#i
26530 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
26540 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
26550 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
26560 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
26570 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
26580 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
26590 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
265a0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
265b0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
265c0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
265d0 0a 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26  .  if( (!pPage &
265e0 26 20 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  & (rc = btreeGet
265f0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
26600 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
26610 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
26620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26630 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
26640 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
26650 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26660 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
26670 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
26680 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
26690 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
266a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
266b0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
266c0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
266d0 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
266e0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
266f0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
26700 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
26710 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
26720 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
26730 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
26740 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
26750 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
26760 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
26770 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
26780 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
26790 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
267a0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
267b0 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
267c0 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
267d0 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
267e0 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
267f0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
26800 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
26810 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
26820 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
26830 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
26840 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
26850 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
26860 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
26870 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
26880 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
26890 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
268a0 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
268b0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
268c0 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
268d0 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
268e0 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
268f0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
26900 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
26910 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
26920 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
26930 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
26940 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61   ){.    int nLea
26950 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
26960 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
26970 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
26980 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
26990 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
269a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
269b0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
269c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
269d0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
269e0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
269f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
26a10 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
26a20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
26a30 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
26a40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
26a50 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 30  .    if( nLeaf<0
26a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
26a70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26a80 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
26a90 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
26aa0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
26ab0 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
26ac0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
26ad0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
26ae0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
26af0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
26b00 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
26b10 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
26b20 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
26b30 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
26b40 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
26b50 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
26b60 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
26b70 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
26b80 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
26b90 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
26ba0 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
26bb0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
26bc0 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
26bd0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
26be0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
26bf0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
26c00 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
26c10 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
26c20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
26c30 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
26c40 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
26c50 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
26c60 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
26c70 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
26c80 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
26c90 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
26ca0 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
26cb0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
26cc0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
26cd0 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
26ce0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
26cf0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
26d00 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  we will contain 
26d10 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
26d20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
26d30 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
26d40 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
26d50 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
26d60 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
26d70 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
26d80 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
26d90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
26da0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
26db0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
26dc0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
26dd0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
26de0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
26df0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
26e00 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
26e10 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
26e20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
26e30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26e40 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
26e50 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
26e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26e70 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
26e80 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
26e90 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
26ea0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
26eb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
26ec0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
26ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26ee0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
26ef0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
26f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
26f10 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
26f20 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
26f30 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  e);.        }.#e
26f40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20  ndif.        rc 
26f50 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
26f60 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
26f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26f80 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
26f90 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
26fa0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
26fb0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
26fc0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
26fd0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26fe0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
26ff0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
27000 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
27010 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
27020 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
27030 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
27040 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
27050 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
27060 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
27070 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
27080 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
27090 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
270a0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
270b0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
270c0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
270d0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
270e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
270f0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
27100 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
27110 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
27120 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
27130 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
27140 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
27150 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
27160 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20 28    ((!pPage) && (
27170 30 20 21 3d 20 28 72 63 20 3d 20 62 74 72 65 65  0 != (rc = btree
27180 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
27190 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29  ge, &pPage, 0)))
271a0 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20  ).     || (0 != 
271b0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
271c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
271d0 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20  DbPage))).  ){. 
271e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
271f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
27200 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
27210 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
27220 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
27230 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
27240 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
27250 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
27260 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
27270 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
27280 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
27290 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
272a0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
272b0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
272c0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
272d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
272e0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
272f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
27300 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
27310 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
27320 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
27330 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
27340 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
27350 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28  eturn freePage2(
27360 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
27370 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
27380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27390 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
273a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
273b0 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
273c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
273d0 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
273e0 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
273f0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
27400 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27410 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
27420 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27430 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
27440 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
27450 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
27460 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
27470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27480 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
27490 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
274a0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
274b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
274c0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
274d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
274e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
274f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
27500 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
27510 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
27520 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
27530 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
27540 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
27550 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
27560 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
27570 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27580 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
27590 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
275a0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
275b0 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
275c0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
275d0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
275e0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
275f0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
27600 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
27610 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
27620 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
27630 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
27640 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
27650 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
27660 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
27670 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
27680 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
27690 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
276a0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
276b0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
276c0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
276d0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
276e0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
276f0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
27700 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
27710 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
27720 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
27730 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
27740 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
27750 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27760 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
27770 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
27780 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
27790 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
277a0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
277b0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
277c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
277d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
277e0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
277f0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
27800 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66  o);.    if( pOvf
27810 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
27820 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
27830 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
27840 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
27850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27860 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
27870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27880 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27890 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
278a0 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
278b0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
278c0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
278d0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
278e0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
278f0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
27900 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
27910 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
27920 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
27930 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
27940 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
27950 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
27960 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
27970 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
27980 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
27990 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
279a0 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
279b0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
279c0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
279d0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
279e0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
279f0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
27a00 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
27a10 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
27a20 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
27a30 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
27a40 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
27a50 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
27a60 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
27a70 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
27a80 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
27a90 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
27aa0 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
27ab0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
27ac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
27ad0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
27ae0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
27af0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
27b00 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
27b10 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
27b20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
27b30 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
27b40 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
27b50 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
27b60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
27b70 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
27b80 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
27b90 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27bb0 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
27bc0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
27bd0 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
27be0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
27bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
27c00 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
27c10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
27c20 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
27c30 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
27c40 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
27c50 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
27c60 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
27c70 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
27c80 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
27c90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27ca0 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
27cb0 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
27cc0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
27cd0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
27ce0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
27cf0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
27d00 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
27d10 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
27d20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27d30 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
27d40 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
27d50 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
27d60 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
27d70 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
27d80 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
27d90 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
27da0 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
27db0 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
27dc0 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
27dd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
27de0 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
27df0 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
27e00 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
27e10 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
27e20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
27e30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
27e40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
27e50 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
27e60 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
27e70 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
27e80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
27e90 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
27ea0 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
27eb0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
27ec0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
27ed0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
27ee0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
27ef0 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
27f00 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
27f10 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
27f20 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
27f30 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
27f40 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
27f50 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
27f60 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
27f70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
27f80 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
27f90 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
27fa0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
27fb0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
27fc0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
27fd0 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
27fe0 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
27ff0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
28000 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
28010 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
28020 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
28030 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
28040 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
28050 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
28060 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
28070 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
28080 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66   nKey>0x7fffffff
28090 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   || pKey==0 ){. 
280a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
280b0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
280c0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
280d0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
280e0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
280f0 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
28100 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
28110 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
28120 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
28130 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
28140 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
28150 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
28160 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
28170 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
28180 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
28190 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
281a0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
281b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
281c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
281d0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
281e0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
281f0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
28200 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
28210 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
28220 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28230 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
28240 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
28250 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
28260 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
28270 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
28280 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
28290 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
282a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
282b0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
282c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
282d0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
282e0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
282f0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
28300 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
28310 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
28320 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28330 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
28340 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
28350 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
28360 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
28370 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
28380 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
28390 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
283a0 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
283b0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
283c0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
283d0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
283e0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
283f0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
28400 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
28410 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
28420 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
28430 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
28440 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
28450 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
28460 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
28470 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
28480 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
28490 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
284a0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
284b0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
284c0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
284d0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
284e0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
284f0 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
28500 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
28510 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
28520 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
28530 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28540 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28550 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
28560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28570 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
28580 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
28590 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
285a0 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
285b0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
285c0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
285d0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
285e0 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
285f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
28600 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
28610 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
28620 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
28630 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28640 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
28650 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
28660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
28670 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
28680 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
28690 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
286a0 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
286b0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
286c0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
286d0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
286e0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
286f0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
28700 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
28710 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
28720 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
28730 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28740 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
28750 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
28760 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
28770 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
28780 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
28790 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
287a0 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
287b0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
287c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
287d0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
287e0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
287f0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
28800 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
28810 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
28820 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
28830 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
28840 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
28850 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
28860 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
28870 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
28880 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
28890 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
288a0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
288b0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
288c0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
288d0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
288e0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
288f0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
28900 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
28910 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
28920 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
28930 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
28940 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
28950 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
28960 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
28970 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
28980 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
28990 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
289a0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
289b0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
289c0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
289d0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
289e0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
289f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
28a00 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
28a10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
28a20 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
28a30 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
28a40 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
28a50 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
28a60 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
28a70 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
28a80 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
28a90 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
28aa0 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
28ab0 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
28ac0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
28ad0 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
28ae0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
28af0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
28b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
28b10 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
28b20 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
28b30 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
28b40 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
28b50 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
28b60 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
28b70 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
28b80 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
28b90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28ba0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
28bb0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
28bc0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
28bd0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
28be0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
28bf0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
28c00 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
28c10 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
28c20 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
28c30 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
28c40 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
28c50 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
28c60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
28c70 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
28c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28c90 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
28ca0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
28cb0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
28cc0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
28cd0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
28ce0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
28cf0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
28d00 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
28d10 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
28d20 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
28d30 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
28d40 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
28d50 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
28d60 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
28d70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
28d80 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
28d90 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
28da0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
28db0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
28dc0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
28dd0 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c  atic int dropCel
28de0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
28df0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
28e00 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
28e10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28e20 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
28e30 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
28e40 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
28e50 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
28e60 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
28e70 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
28e80 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
28e90 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
28ea0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
28eb0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
28ec0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
28ed0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
28ee0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
28ef0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
28f00 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
28f10 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
28f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
28f30 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
28f40 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
28f50 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
28f60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
28f70 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
28f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28f90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
28fa0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
28fb0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
28fc0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
28fd0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
28fe0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
28ff0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
29000 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28  te(ptr);.  if( (
29010 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  pc<pPage->hdrOff
29020 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
29030 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c  af?0:4)).     ||
29040 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70   (pc+sz>pPage->p
29050 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
29060 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29070 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29080 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  T;.  }.  rc = fr
29090 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
290a0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
290b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
290c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
290d0 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
290e0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
290f0 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
29100 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
29110 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
29120 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
29130 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
29140 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
29150 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
29160 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
29170 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
29180 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72  ee += 2;.  retur
29190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
291a0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
291b0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
291c0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
291d0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
291e0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
291f0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
29200 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
29210 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
29220 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
29230 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
29240 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
29250 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
29260 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
29270 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
29280 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
29290 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
292a0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
292b0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
292c0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
292d0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
292e0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
292f0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
29300 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
29310 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
29320 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
29330 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
29340 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
29350 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
29360 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
29370 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
29380 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
29390 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
293a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
293b0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
293c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
293d0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
293e0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
293f0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
29400 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
29410 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
29420 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
29430 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
29440 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
29450 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
29460 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
29470 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
29480 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
29490 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
294a0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
294b0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
294c0 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
294d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
294e0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
294f0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
29500 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
29510 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29520 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
29530 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
29540 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
29550 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
29560 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
29570 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
29580 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
29590 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
295a0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
295b0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
295c0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
295d0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
295e0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
295f0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
29600 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ild       /* If 
29610 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
29620 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
29630 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
29640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
29650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
29660 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
29670 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
29680 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
29690 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
296a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
296b0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
296c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
296d0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
296e0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
296f0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
29700 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
29710 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
29720 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
29730 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
29740 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
29750 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
29760 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
29770 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
29780 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
29790 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
297a0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
297b0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
297c0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
297d0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
297e0 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
297f0 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
29800 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  ata[] */..  int 
29810 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
29820 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73  ? 4 : 0);..  ass
29830 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
29840 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
29850 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
29860 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29870 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
29880 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
29890 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
298a0 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61  Bt)<=5460 );.  a
298b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
298c0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
298d0 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  ze(pPage->aOvfl)
298e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
298f0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
29900 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20  age, pCell) );. 
29910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29920 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
29930 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29940 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
29950 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
29960 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
29970 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
29980 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
29990 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
299a0 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
299b0 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
299c0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
299d0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
299e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
299f0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
29a00 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
29a10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
29a20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
29a30 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
29a40 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
29a50 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
29a60 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
29a70 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
29a80 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
29a90 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
29aa0 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
29ab0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
29ac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29ad0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
29ae0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
29af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29b00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29b10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
29b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29b30 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29b40 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
29b50 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
29b60 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
29b70 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
29b80 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
29b90 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
29ba0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
29bb0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
29bc0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
29bd0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
29be0 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
29bf0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
29c00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29c10 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 65 6e   assert( idx>=en
29c20 64 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 69  d+2 );.    if( i
29c30 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  dx+sz > pPage->p
29c40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
29c50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
29c60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29c70 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  PT;.    }.    pP
29c80 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
29c90 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
29ca0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
29cb0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
29cc0 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43  a[idx+nSkip], pC
29cd0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
29ce0 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43  kip);.    if( iC
29cf0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
29d00 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
29d10 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
29d20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c  }.    for(j=end,
29d30 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
29d40 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
29d50 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
29d60 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
29d70 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
29d80 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
29d90 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
29da0 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
29db0 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
29dc0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
29dd0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
29de0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29df0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29e00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
29e10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
29e20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
29e30 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
29e40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
29e50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
29e60 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
29e70 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
29e80 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
29e90 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
29ea0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
29eb0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
29ec0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
29ed0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
29ee0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29ef0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
29f00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29f10 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
29f20 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
29f30 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
29f40 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
29f50 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
29f60 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
29f70 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
29f80 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
29f90 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
29fa0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29fb0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
29fc0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
29fd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
29fe0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
29ff0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2a000 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
2a010 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2a020 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
2a030 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
2a040 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
2a050 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
2a060 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
2a070 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
2a080 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a090 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2a0a0 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20    u8 *pCellptr; 
2a0b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2a0c0 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
2a0d0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
2a0e0 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
2a0f0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2a100 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
2a110 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
2a120 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
2a130 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2a140 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
2a150 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2a160 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
2a170 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
2a180 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2a190 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
2a1a0 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2a1b0 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61  nt nUsable = pPa
2a1c0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2a1d0 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
2a1e0 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a  ize of page */..
2a1f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a200 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2a210 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a220 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a230 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
2a250 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
2a260 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
2a270 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
2a280 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
2a290 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2a2a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2a2b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2a2c0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2a2d0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2a2e0 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
2a2f0 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
2a300 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
2a310 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2a320 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a330 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2a340 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65  hdr+5])==nUsable
2a350 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20   );..  pCellptr 
2a360 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2a370 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
2a380 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
2a390 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
2a3a0 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
2a3b0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65  0; i--){.    pCe
2a3c0 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2a3d0 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a  cellbody -= aSiz
2a3e0 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  e[i];.    put2by
2a3f0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2a400 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2a410 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2a420 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
2a430 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Size[i]);.  }.  
2a440 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2a450 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
2a460 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2a470 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
2a480 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2a490 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
2a4a0 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
2a4b0 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
2a4c0 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
2a4d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2a4e0 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
2a4f0 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
2a500 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
2a510 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
2a520 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
2a530 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2a540 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
2a550 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2a560 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
2a570 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2a580 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
2a590 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
2a5a0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
2a5b0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
2a5c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
2a5d0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
2a5e0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
2a5f0 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
2a600 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
2a610 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
2a620 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
2a630 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
2a640 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
2a650 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
2a660 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
2a670 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
2a680 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
2a690 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
2a6a0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
2a6b0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
2a6c0 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
2a6d0 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
2a6e0 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
2a6f0 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
2a700 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
2a710 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
2a720 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
2a730 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
2a740 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
2a750 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a760 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2a770 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2a780 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
2a790 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
2a7a0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
2a7b0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
2a7c0 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
2a7d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2a7e0 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
2a7f0 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
2a800 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
2a810 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
2a820 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2a830 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
2a840 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
2a850 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
2a860 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
2a870 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
2a880 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
2a890 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
2a8a0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
2a8b0 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
2a8c0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
2a8d0 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
2a8e0 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
2a8f0 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2a900 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2a910 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2a920 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2a930 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2a940 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2a950 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2a960 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2a970 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2a980 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2a990 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2a9a0 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2a9b0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2a9c0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2a9d0 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2a9e0 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2a9f0 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2aa00 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2aa10 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2aa20 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2aa30 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2aa40 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2aa50 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2aa60 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2aa70 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2aa80 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2aa90 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2aaa0 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2aab0 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2aac0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2aad0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2aae0 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2aaf0 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2ab00 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2ab10 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2ab20 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2ab30 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2ab40 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2ab50 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2ab60 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2ab70 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2ab80 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2ab90 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2aba0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2abb0 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2abc0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2abd0 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2abe0 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2abf0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2ac00 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2ac10 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2ac20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2ac30 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2ac40 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2ac50 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2ac60 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2ac70 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2ac80 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2ac90 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2aca0 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2acb0 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2acd0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2ace0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2acf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad10 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2ad20 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2ad30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ad40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ad50 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2ad60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2ad70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ad80 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2ad90 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2ada0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2adb0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2adc0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2add0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ade0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2adf0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
2ae00 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll<=0 ) return S
2ae10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ae20 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
2ae30 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
2ae40 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2ae50 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
2ae60 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
2ae70 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
2ae80 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
2ae90 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
2aea0 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2aeb0 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
2aec0 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
2aed0 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
2aee0 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
2aef0 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
2af00 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2af10 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2af20 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
2af30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
2af40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
2af50 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
2af60 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
2af70 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
2af80 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
2af90 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
2afa0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2afb0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2afc0 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
2afd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2afe0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2aff0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
2b000 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b010 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
2b020 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2b030 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2b040 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
2b050 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
2b060 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2b070 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
2b080 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
2b090 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
2b0a0 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
2b0b0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2b0c0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2b0d0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2b0e0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
2b0f0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
2b100 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
2b110 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
2b120 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
2b130 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
2b140 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
2b150 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
2b160 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
2b170 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
2b180 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
2b190 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
2b1a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
2b1b0 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
2b1c0 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
2b1d0 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
2b1e0 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
2b1f0 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
2b200 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
2b210 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2b220 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2b230 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
2b240 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
2b250 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
2b260 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
2b270 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
2b280 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
2b290 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
2b2a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2b2b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2b2c0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b2d0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b2e0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2b2f0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2b300 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2b310 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2b320 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
2b330 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2b340 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b350 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2b360 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a  r(pNew, pCell);.
2b370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b380 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2b390 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2b3a0 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2b3b0 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2b3c0 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2b3d0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2b3e0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2b3f0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2b400 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2b410 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2b420 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2b430 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2b440 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2b450 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2b460 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2b470 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2b480 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2b490 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2b4a0 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2b4b0 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2b4c0 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2b4d0 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2b4e0 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2b4f0 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2b500 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2b510 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2b520 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2b530 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2b540 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2b550 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2b560 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2b570 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2b580 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2b590 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2b5a0 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2b5b0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2b5c0 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2b5d0 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2b5e0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2b5f0 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2b600 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2b610 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2b620 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2b630 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2b640 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2b650 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2b660 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b670 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2b680 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2b690 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2b6a0 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2b6b0 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2b6c0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2b6d0 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2b6e0 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2b6f0 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2b700 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2b710 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2b720 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2b730 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2b740 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2b750 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2b760 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2b770 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  nt,pParent->nCel
2b780 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70  l,pSpace,(int)(p
2b790 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50  Out-pSpace),0,pP
2b7a0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  age->pgno);..   
2b7b0 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2b7c0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2b7d0 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2b7e0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2b7f0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2b800 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2b810 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2b820 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2b830 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2b840 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2b850 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2b860 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2b870 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2b880 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b890 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2b8a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2b8b0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2b8c0 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2b8d0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2b8e0 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2b8f0 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2b900 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2b910 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2b920 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2b930 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2b940 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2b950 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2b960 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2b970 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2b980 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2b990 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2b9a0 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2b9b0 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2b9c0 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2b9d0 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2b9e0 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2b9f0 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2ba00 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2ba10 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2ba20 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2ba30 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2ba40 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2ba50 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2ba60 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2ba70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2ba80 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2ba90 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2baa0 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2bab0 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2bac0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
2bad0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20  llPtr(pPage, z, 
2bae0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  &info);.      if
2baf0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2bb00 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2bb10 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
2bb20 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  (&z[info.iOverfl
2bb30 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ow]);.        pt
2bb40 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66  rmapGet(pBt, ovf
2bb50 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &e, &n);.    
2bb60 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2bb70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2bb80 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
2bb90 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
2bba0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2bbb0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50  eaf ){.        P
2bbc0 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2bbd0 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  byte(z);.       
2bbe0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2bbf0 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2bc00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bc10 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2bc20 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2bc30 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E );.      }.   
2bc40 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67   }.    if( !pPag
2bc50 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2bc60 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2bc70 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2bc80 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2bc90 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20  ffset+8]);.     
2bca0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2bcb0 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2bcc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2bcd0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2bce0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2bcf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2bd00 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2bd10 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2bd20 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2bd30 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  o copy the conte
2bd40 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  nts of the b-tre
2bd50 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a  e node stored .*
2bd60 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20  * on page pFrom 
2bd70 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  to page pTo. If 
2bd80 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e  page pFrom was n
2bd90 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
2bda0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  then.** the poin
2bdb0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
2bdc0 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70  for each child p
2bdd0 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20  age are updated 
2bde0 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  so that the.** p
2bdf0 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65  arent page store
2be00 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  d in the pointer
2be10 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f   map is page pTo
2be20 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
2be30 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c  ined.** any cell
2be40 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  s with overflow 
2be50 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74  page pointers, t
2be60 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
2be70 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a  nding pointer.**
2be80 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65   map entries are
2be90 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f   also updated so
2bea0 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
2beb0 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54   page is page pT
2bec0 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  o..**.** If pFro
2bed0 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63  m is currently c
2bee0 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72  arrying any over
2bef0 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72  flow cells (entr
2bf00 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65  ies in the.** Me
2bf10 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72  mPage.aOvfl[] ar
2bf20 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
2bf30 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
2bf40 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
2bf50 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
2bf60 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
2bf70 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
2bf80 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
2bf90 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
2bfa0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2bfb0 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
2bfc0 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
2bfd0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
2bfe0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2bff0 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
2c000 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
2c010 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
2c020 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
2c030 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
2c040 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
2c050 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
2c060 6e 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  nt copyNodeConte
2c070 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
2c080 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29  m, MemPage *pTo)
2c090 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20 63  {.  BtShared * c
2c0a0 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
2c0b0 2d 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ->pBt;.  u8 * co
2c0c0 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
2c0d0 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  m->aData;.  u8 *
2c0e0 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
2c0f0 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63  ->aData;.  int c
2c100 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
2c110 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
2c120 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54  ;.  int const iT
2c130 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
2c140 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
2c150 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  );.  int rc = SQ
2c160 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
2c170 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
2c180 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29   pFrom->isInit )
2c190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ;.  assert( pFro
2c1a0 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
2c1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2c1c0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2c1d0 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d  romHdr+5])<=pBt-
2c1e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a  >usableSize );..
2c1f0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
2c200 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
2c210 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
2c220 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
2c230 2f 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74 32  /.  iData = get2
2c240 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2c250 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  mHdr+5]);.  memc
2c260 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2c270 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2c280 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2c290 44 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28  Data);.  memcpy(
2c2a0 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
2c2b0 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
2c2c0 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
2c2d0 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
2c2e0 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69  ll);..  /* Reini
2c2f0 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
2c300 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
2c310 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
2c320 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
2c330 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
2c340 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
2c350 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
2c360 6f 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c  o "cannot" fail,
2c370 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   as the.  ** dat
2c380 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46  a copied from pF
2c390 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  rom is known to 
2c3a0 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20  be valid.  */.  
2c3b0 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
2c3c0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d  .  TESTONLY(rc =
2c3d0 20 29 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   ) btreeInitPage
2c3e0 28 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  (pTo);.  assert(
2c3f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c400 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
2c410 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2c420 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2c430 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2c440 61 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  ap entries.  ** 
2c450 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
2c460 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
2c470 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
2c480 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
2c490 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66 28  ers to. */.  if(
2c4a0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2c4b0 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
2c4c0 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
2c4d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c4e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2c4f0 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
2c500 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
2c510 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
2c520 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2c530 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
2c540 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
2c550 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
2c560 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
2c570 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
2c580 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
2c590 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
2c5a0 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
2c5b0 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
2c5c0 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
2c5d0 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
2c5e0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
2c5f0 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
2c600 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
2c610 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
2c620 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
2c630 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
2c640 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
2c650 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
2c660 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
2c670 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
2c680 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
2c690 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
2c6a0 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
2c6b0 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
2c6c0 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
2c6d0 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
2c6e0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
2c6f0 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
2c700 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2c710 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
2c720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
2c730 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
2c740 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
2c750 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
2c760 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
2c770 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
2c780 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
2c790 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
2c7a0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
2c7b0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
2c7c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2c7d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
2c7e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
2c7f0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
2c800 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
2c810 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
2c820 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
2c830 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
2c840 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2c850 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
2c860 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
2c870 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
2c880 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
2c890 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
2c8a0 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
2c8b0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2c8c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2c8d0 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
2c8e0 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
2c8f0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
2c900 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
2c910 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
2c920 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
2c930 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2c940 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
2c950 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
2c960 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
2c970 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
2c980 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
2c990 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
2c9a0 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
2c9b0 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
2c9c0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
2c9d0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
2c9e0 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
2c9f0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
2ca00 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
2ca10 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
2ca20 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
2ca30 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
2ca40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
2ca50 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
2ca60 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
2ca70 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
2ca80 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
2ca90 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
2caa0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
2cab0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
2cac0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
2cad0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2cae0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2caf0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2cb00 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
2cb10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2cb20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67 65  a.** buffer page
2cb30 2d 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20 73  -size bytes in s
2cb40 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73 65  ize. If, in inse
2cb50 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f  rting cells into
2cb60 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70   the parent.** p
2cb70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20 74  age (pParent), t
2cb80 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
2cb90 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
2cba0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
2cbb0 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2cbc0 20 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76 65   the parents ove
2cbd0 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63  rflow cells. Bec
2cbe0 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
2cbf0 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20  on inserts.** a 
2cc00 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20  maximum of four 
2cc10 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
2cc20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2cc30 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ge, and the maxi
2cc40 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61  mum.** size of a
2cc50 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74   cell stored wit
2cc60 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  hin an internal 
2cc70 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c  node is always l
2cc80 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20  ess than 1/4.** 
2cc90 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
2cca0 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  , the aOvflSpace
2ccb0 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61  [] buffer is gua
2ccc0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61  ranteed to be la
2ccd0 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f  rge.** enough fo
2cce0 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63  r all overflow c
2ccf0 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ells..**.** If a
2cd00 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74  OvflSpace is set
2cd10 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   to a null point
2cd20 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2cd30 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
2cd40 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
2cd50 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2cd60 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
2cd70 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd90 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
2cda0 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
2cdb0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
2cdc0 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2cde0 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
2cdf0 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
2ce00 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
2ce10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2ce20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
2ce30 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
2ce40 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
2ce50 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20  /.  int isRoot  
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
2ce80 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
2ce90 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74  -page */.){.  Bt
2cea0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2ceb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cec0 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
2ced0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
2cee0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2cef0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cf00 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2cf10 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
2cf20 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
2cf30 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
2cf40 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
2cf50 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
2cf60 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
2cf70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2cf80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2cf90 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
2cfa0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2cfd0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
2cfe0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
2cff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d000 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d010 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
2d020 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2d030 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
2d040 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
2d050 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
2d060 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d070 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d080 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2d090 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
2d0a0 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
2d0b0 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
2d0c0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
2d0d0 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
2d0e0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
2d0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d100 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
2d110 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
2d120 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
2d130 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
2d140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2d150 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
2d160 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
2d170 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
2d180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d190 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
2d1a0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
2d1b0 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d1d0 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
2d1e0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
2d1f0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
2d200 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
2d210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d220 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2d230 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
2d240 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
2d250 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
2d260 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2d270 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
2d280 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
2d290 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
2d2a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2d2b0 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
2d2c0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
2d2d0 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
2d2e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
2d2f0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
2d300 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
2d310 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
2d320 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
2d330 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
2d340 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
2d350 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2d360 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2d370 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
2d380 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
2d390 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
2d3a0 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
2d3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d3c0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
2d3d0 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
2d3e0 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
2d3f0 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
2d400 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
2d410 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
2d420 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
2d430 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
2d440 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2d450 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
2d460 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
2d470 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
2d480 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
2d490 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
2d4a0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
2d4b0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
2d4c0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
2d4d0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
2d4e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2d4f0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
2d500 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
2d510 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
2d520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d530 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
2d540 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
2d550 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
2d560 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
2d570 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
2d580 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
2d590 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
2d5a0 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d5c0 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
2d5d0 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
2d5e0 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
2d5f0 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
2d600 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d610 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2d620 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2d630 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2d640 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2d650 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2d660 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
2d670 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
2d680 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
2d690 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
2d6a0 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
2d6b0 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
2d6c0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
2d6d0 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
2d6e0 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
2d6f0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
2d700 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
2d710 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
2d720 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
2d730 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
2d740 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
2d750 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
2d760 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
2d770 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
2d780 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
2d790 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
2d7a0 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
2d7b0 74 72 65 65 44 65 6c 65 74 65 28 29 2e 20 2a 2f  treeDelete(). */
2d7c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2d7d0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2d7e0 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
2d7f0 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
2d800 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
2d810 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2d820 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2d830 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64  ].idx==iParentId
2d840 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
2d850 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
2d860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d870 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
2d880 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
2d890 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
2d8a0 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
2d8b0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2d8c0 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
2d8d0 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
2d8e0 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
2d8f0 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
2d900 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
2d910 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
2d920 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
2d930 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
2d940 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
2d950 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
2d960 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
2d970 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
2d980 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
2d990 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
2d9a0 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
2d9b0 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
2d9c0 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
2d9d0 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
2d9e0 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
2d9f0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
2da00 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
2da10 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
2da20 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
2da30 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
2da40 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
2da50 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
2da60 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
2da70 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
2da80 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
2da90 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
2daa0 65 2c 20 61 73 20 69 66 20 6f 6e 65 20 65 78 69  e, as if one exi
2dab0 73 74 65 64 20 69 74 20 68 61 73 20 61 6c 72 65  sted it has alre
2dac0 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 72 65  ady.  ** been re
2dad0 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20 69 20 3d  moved.  */.  i =
2dae0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2daf0 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
2db00 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
2db10 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
2db20 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31  ;.    nOld = i+1
2db30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
2db40 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28  Old = 3;.    if(
2db50 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29   iParentIdx==0 )
2db60 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
2db70 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d    .      nxDiv =
2db80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
2db90 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20  ( iParentIdx==i 
2dba0 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  ){.      nxDiv =
2dbb0 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   i-2;.    }else{
2dbc0 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69  .      nxDiv = i
2dbd0 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20  ParentIdx-1;.   
2dbe0 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20   }.    i = 2;.  
2dbf0 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  }.  if( (i+nxDiv
2dc00 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2dc10 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
2dc20 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
2dc30 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
2dc40 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2dc50 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
2dc60 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
2dc70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2dc80 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2dc90 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
2dca0 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
2dcb0 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
2dcc0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
2dcd0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2dce0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2dcf0 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
2dd00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2dd10 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
2dd20 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  , i*sizeof(MemPa
2dd30 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
2dd40 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2dd50 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
2dd60 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
2dd70 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
2dd80 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
2dd90 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
2dda0 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
2ddb0 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  if( pParent->nOv
2ddc0 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e 78 44 69  erflow && i+nxDi
2ddd0 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  v==pParent->aOvf
2dde0 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20 20 20 20  l[0].idx ){.    
2ddf0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
2de00 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  rent->aOvfl[0].p
2de10 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f  Cell;.      pgno
2de20 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2de30 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
2de40 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
2de50 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2de60 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
2de70 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2de80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2de90 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2dea0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2deb0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2dec0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
2ded0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
2dee0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
2def0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
2df00 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2df10 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2df20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
2df30 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
2df40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2df50 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
2df60 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
2df70 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
2df80 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
2df90 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
2dfa0 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
2dfb0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2dfc0 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
2dfd0 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
2dfe0 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
2dff0 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
2e000 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
2e010 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
2e020 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
2e030 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
2e040 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
2e050 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2e060 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
2e070 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
2e080 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
2e090 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
2e0a0 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2e0b0 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  s SQLite is comp
2e0c0 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64  iled in secure-d
2e0d0 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74  elete mode. In t
2e0e0 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20  his case,.      
2e0f0 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
2e100 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
2e110 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
2e120 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
2e130 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
2e140 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
2e150 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
2e160 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
2e170 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
2e180 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
2e190 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
2e1a0 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
2e1b0 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
2e1c0 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
2e1d0 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
2e1e0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2e1f0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
2e200 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
2e210 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
2e220 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
2e230 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
2e240 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 70  ew[i]);.      ap
2e250 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
2e260 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
2e270 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 23  arent->aData];.#
2e280 65 6e 64 69 66 0a 20 20 20 20 20 20 64 72 6f 70  endif.      drop
2e290 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2e2a0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2e2b0 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b  Overflow, szNew[
2e2c0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i]);.    }.  }..
2e2d0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
2e2e0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
2e2f0 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
2e300 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
2e310 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
2e320 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
2e330 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
2e340 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
2e350 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2e360 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
2e370 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
2e380 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
2e390 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2e3a0 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
2e3b0 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
2e3c0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
2e3d0 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
2e3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
2e3f0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
2e400 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
2e410 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
2e420 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
2e430 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
2e440 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
2e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e460 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
2e470 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
2e480 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
2e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2e4b0 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
2e4c0 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
2e4d0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
2e4e0 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
2e4f0 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
2e500 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2e510 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2e520 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2e530 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
2e540 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
2e550 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
2e560 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
2e570 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
2e580 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
2e590 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2e5a0 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
2e5b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
2e5c0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
2e5d0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
2e5e0 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
2e5f0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
2e600 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
2e610 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
2e620 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
2e630 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
2e640 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
2e650 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
2e660 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
2e670 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
2e680 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
2e690 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
2e6a0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
2e6b0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
2e6c0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
2e6d0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
2e6e0 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
2e6f0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
2e700 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
2e710 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
2e720 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
2e730 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
2e740 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
2e750 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
2e760 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
2e770 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
2e780 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
2e790 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
2e7a0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
2e7b0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
2e7c0 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
2e7d0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2e7e0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
2e7f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2e800 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
2e810 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
2e820 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
2e830 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2e840 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
2e850 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
2e860 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
2e870 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
2e880 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
2e890 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
2e8a0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
2e8b0 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
2e8c0 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
2e8d0 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
2e8e0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
2e8f0 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
2e900 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2e910 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
2e920 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
2e930 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2e940 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
2e950 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
2e960 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
2e970 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
2e980 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2e990 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
2e9a0 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
2e9b0 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
2e9c0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
2e9d0 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
2e9e0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
2e9f0 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
2ea00 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
2ea10 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
2ea20 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
2ea30 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
2ea40 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
2ea50 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
2ea60 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
2ea70 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
2ea80 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
2ea90 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
2eaa0 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
2eab0 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
2eac0 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
2ead0 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
2eae0 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
2eaf0 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
2eb00 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
2eb10 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
2eb20 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2eb30 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
2eb40 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2eb50 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2eb60 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
2eb70 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
2eb80 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
2eb90 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2eba0 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
2ebb0 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
2ebc0 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65  ell]);.      nCe
2ebd0 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
2ebe0 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20  if( i<nOld-1 && 
2ebf0 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20  !leafData){.    
2ec00 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29    u16 sz = (u16)
2ec10 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  szNew[i];.      
2ec20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2ec30 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
2ec40 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2ec50 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2ec60 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d  = sz;.      pTem
2ec70 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
2ec80 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70  ace1];.      iSp
2ec90 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
2eca0 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
2ecb0 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
2ecc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2ecd0 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
2ece0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
2ecf0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
2ed00 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
2ed10 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
2ed20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
2ed30 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
2ed40 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2ed50 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
2ed60 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
2ed70 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2ed80 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
2ed90 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
2eda0 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
2edb0 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
2edc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2edd0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
2ede0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2edf0 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
2ee00 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
2ee10 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
2ee20 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
2ee30 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
2ee40 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
2ee50 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
2ee60 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
2ee70 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
2ee80 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
2ee90 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
2eea0 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
2eeb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eec0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2eed0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
2eee0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2eef0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
2ef00 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2ef10 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
2ef20 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
2ef30 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
2ef40 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2ef50 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
2ef60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
2ef70 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
2ef80 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
2ef90 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
2efa0 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
2efb0 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
2efc0 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
2efd0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
2efe0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
2eff0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
2f000 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
2f010 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
2f020 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
2f030 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
2f040 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
2f050 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
2f060 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
2f070 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
2f080 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
2f090 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
2f0a0 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
2f0b0 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
2f0c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
2f0d0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
2f0e0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
2f0f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
2f100 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
2f110 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
2f120 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
2f130 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
2f140 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
2f150 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2f160 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
2f170 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
2f180 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
2f190 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
2f1a0 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
2f1b0 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
2f1c0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
2f1d0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
2f1e0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
2f1f0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2f200 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
2f210 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
2f220 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
2f230 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
2f240 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
2f250 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2f260 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
2f270 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
2f280 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
2f290 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
2f2a0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
2f2b0 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
2f2c0 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
2f2d0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
2f2e0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
2f2f0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
2f300 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
2f310 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
2f320 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
2f330 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
2f340 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
2f350 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
2f360 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
2f370 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f380 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
2f390 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
2f3a0 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
2f3b0 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
2f3c0 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
2f3d0 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
2f3e0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
2f3f0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
2f400 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
2f410 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
2f420 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
2f430 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
2f440 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
2f450 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
2f460 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
2f470 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
2f480 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
2f490 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
2f4a0 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
2f4b0 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
2f4c0 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
2f4d0 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
2f4e0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
2f4f0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
2f500 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2f510 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
2f520 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
2f530 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
2f540 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
2f550 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
2f560 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
2f570 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
2f580 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2f590 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
2f5a0 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
2f5b0 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
2f5c0 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
2f5d0 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
2f5e0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
2f5f0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
2f600 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
2f610 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
2f620 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
2f630 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
2f640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
2f650 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
2f660 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
2f670 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
2f680 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
2f690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2f6a0 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
2f6b0 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
2f6c0 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
2f6d0 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
2f6e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
2f6f0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
2f700 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
2f710 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
2f720 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
2f730 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
2f740 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
2f750 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
2f760 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
2f770 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
2f780 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
2f790 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
2f7a0 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
2f7b0 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
2f7c0 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
2f7d0 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
2f7e0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
2f7f0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
2f800 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
2f810 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
2f820 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
2f830 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
2f840 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
2f850 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
2f860 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
2f870 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
2f880 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
2f890 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
2f8a0 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
2f8b0 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
2f8c0 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69  ])>0) or pPage i
2f8d0 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c  s.  ** a virtual
2f8e0 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76   root page.  A v
2f8f0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2f900 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61   is when the rea
2f910 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65  l root.  ** page
2f920 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77   is page 1 and w
2f930 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63  e are the only c
2f940 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67  hild of that pag
2f950 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2f960 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
2f970 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
2f980 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
2f990 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54  Cell==0) );..  T
2f9a0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2f9b0 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22  old: %d %d %d  "
2f9c0 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ,.    apOld[0]->
2f9d0 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  pgno, .    nOld>
2f9e0 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70  =2 ? apOld[1]->p
2f9f0 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  gno : 0,.    nOl
2fa00 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d  d>=3 ? apOld[2]-
2fa10 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a  >pgno : 0.  ));.
2fa20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
2fa30 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
2fa40 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
2fa50 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
2fa60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f  ..  */.  if( apO
2fa70 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29  ld[0]->pgno<=1 )
2fa80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2fa90 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 67  E_CORRUPT;.    g
2faa0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2fab0 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46  nup;.  }.  pageF
2fac0 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  lags = apOld[0]-
2fad0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
2fae0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2faf0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
2fb00 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
2fb10 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
2fb20 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
2fb30 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
2fb40 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
2fb50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fb60 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
2fb70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
2fb80 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
2fb90 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2fba0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2fbb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2fbc0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
2fbd0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2fbe0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2fbf0 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f  New, &pgno, pgno
2fc00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2fc10 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2fc20 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2fc30 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
2fc40 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
2fc50 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
2fc60 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2fc70 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
2fc80 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
2fc90 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
2fca0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2fcb0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2fcc0 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
2fcd0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2fce0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
2fcf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2fd00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fd10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2fd20 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2fd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2fd40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2fd50 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
2fd60 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
2fd70 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
2fd80 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
2fd90 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
2fda0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2fdb0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
2fdc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2fdd0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2fde0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2fdf0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
2fe00 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
2fe10 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
2fe20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
2fe30 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
2fe40 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
2fe50 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
2fe60 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
2fe70 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
2fe80 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
2fe90 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
2fea0 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
2feb0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
2fec0 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
2fed0 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
2fee0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
2fef0 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
2ff00 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
2ff10 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
2ff20 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
2ff30 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
2ff40 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
2ff50 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
2ff60 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
2ff70 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
2ff80 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
2ff90 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
2ffa0 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
2ffb0 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
2ffc0 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
2ffd0 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
2ffe0 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
2fff0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
30000 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
30010 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
30020 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
30030 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
30040 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
30050 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
30060 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
30070 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
30080 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
30090 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
300a0 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d     if( apNew[j]-
300b0 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29  >pgno<(unsigned)
300c0 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
300d0 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
300e0 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a    minV = apNew[j
300f0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ]->pgno;.      }
30100 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
30110 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
30120 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
30130 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
30140 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
30150 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  o;.      pT = ap
30160 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  New[i];.      ap
30170 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
30180 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
30190 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
301a0 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
301b0 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64  ("new: %d(%d) %d
301c0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
301d0 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
301e0 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f    apNew[0]->pgno
301f0 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
30200 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b  nNew>=2 ? apNew[
30210 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  1]->pgno : 0, nN
30220 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
30230 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
30240 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67  3 ? apNew[2]->pg
30250 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  no : 0, nNew>=3 
30260 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
30270 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70      nNew>=4 ? ap
30280 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[3]->pgno : 0
30290 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
302a0 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
302b0 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d  ew>=5 ? apNew[4]
302c0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
302d0 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
302e0 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28   0));..  assert(
302f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
30300 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
30310 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
30320 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c  put4byte(pRight,
30330 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e   apNew[nNew-1]->
30340 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  pgno);..  /*.  *
30350 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
30360 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
30370 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
30380 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
30390 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
303a0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
303b0 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
303c0 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
303d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
303e0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
303f0 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
30400 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
30410 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
30420 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
30430 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
30440 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
30450 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
30460 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20  pageFlags);.    
30470 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
30480 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20  w, cntNew[i]-j, 
30490 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43  &apCell[j], &szC
304a0 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73  ell[j]);.    ass
304b0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
304c0 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26  >0 || (nNew==1 &
304d0 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20  & cntNew[0]==0) 
304e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
304f0 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  New->nOverflow==
30500 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e  0 );..    j = cn
30510 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
30520 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
30530 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
30540 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
30550 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
30560 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
30570 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
30580 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
30590 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
305a0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65     assert( i<nNe
305b0 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20  w-1 || j==nCell 
305c0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65  );.    if( j<nCe
305d0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
305e0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
305f0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
30600 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
30610 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
30620 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
30630 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
30640 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
30650 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
30660 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
30670 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  = &aOvflSpace[iO
30680 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  vflSpace];.     
30690 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
306a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
306b0 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
306c0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
306d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
306e0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
306f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65     /* If the tre
30700 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
30710 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
30720 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
30730 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
30740 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
30750 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
30760 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
30770 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
30780 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
30790 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
307a0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
307b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
307c0 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
307d0 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
307e0 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
307f0 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
30800 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
30810 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
30820 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
30830 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
30840 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
30850 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
30860 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
30870 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d  mp;.        sz =
30880 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26   4 + putVarint(&
30890 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e  pCell[4], info.n
308a0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54  Key);.        pT
308b0 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
308c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
308d0 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
308e0 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
308f0 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
30900 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
30910 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
30920 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
30930 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
30940 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
30950 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
30960 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
30970 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
30980 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
30990 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
309a0 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
309b0 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50    ** (see btreeP
309c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34  arseCellPtr(), 4
309d0 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69   bytes is the mi
309e0 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20  nimum size of.  
309f0 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c        ** any cel
30a00 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d  l). But it is im
30a10 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20  portant to pass 
30a20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65  the correct size
30a30 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   to .        ** 
30a40 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f  insertCell(), so
30a50 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c   reparse the cel
30a60 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  l now..        *
30a70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
30a80 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20  e that this can 
30a90 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20  never happen in 
30aa0 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66  an SQLite data f
30ab0 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20  ile, as all.    
30ac0 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65      ** cells are
30ad0 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
30ae0 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65  s. It only happe
30af0 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73  ns in b-trees us
30b00 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ed.        ** to
30b10 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53   evaluate "IN (S
30b20 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20  ELECT ...)" and 
30b30 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e  similar clauses.
30b40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30b50 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a      if( szCell[j
30b60 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==4 ){.        
30b70 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72    assert(leafCor
30b80 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20  rection==4);.   
30b90 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
30ba0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
30bb0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pCell);.       
30bc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30bd0 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73   iOvflSpace += s
30be0 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
30bf0 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
30c00 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73  ze/4 );.      as
30c10 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65  sert( iOvflSpace
30c20 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
30c30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
30c40 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
30c50 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
30c60 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d  sz, pTemp, pNew-
30c70 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
30c80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30c90 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
30ca0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
30cb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30cc0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30cd0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
30ce0 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
30cf0 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
30d00 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
30d10 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
30d20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
30d30 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
30d40 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
30d50 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
30d60 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
30d70 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
30d80 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
30d90 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
30da0 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
30db0 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
30dc0 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
30dd0 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
30de0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
30df0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
30e00 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
30e10 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
30e20 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
30e30 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
30e40 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
30e50 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
30e60 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
30e70 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
30e80 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
30e90 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
30ea0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
30eb0 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
30ec0 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
30ed0 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
30ee0 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
30ef0 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
30f00 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
30f10 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
30f20 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
30f30 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
30f40 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
30f50 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
30f60 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
30f70 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
30f80 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
30f90 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
30fa0 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
30fb0 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
30fc0 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
30fd0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
30fe0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
30ff0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
31000 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
31010 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
31020 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
31030 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
31040 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
31050 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
31060 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
31070 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
31080 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
31090 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
310a0 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
310b0 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
310c0 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
310d0 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
310e0 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
310f0 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
31100 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
31110 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
31120 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
31130 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
31140 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
31150 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
31160 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
31170 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
31180 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
31190 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
311a0 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
311b0 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
311c0 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
311d0 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ) .    );.    if
311e0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
311f0 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65   = copyNodeConte
31200 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61  nt(apNew[0], pPa
31210 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20  rent)) ){.      
31220 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70  rc = freePage(ap
31230 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[0]);.    }. 
31240 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
31250 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
31260 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
31270 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
31280 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
31290 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
312a0 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
312b0 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
312c0 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
312d0 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
312e0 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
312f0 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
31300 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
31310 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
31320 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
31330 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
31340 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
31350 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
31360 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
31370 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
31380 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
31390 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
313a0 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
313b0 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
313c0 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
313d0 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
313e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
313f0 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
31400 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
31410 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
31420 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
31430 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
31440 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
31450 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
31460 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
31470 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
31480 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
31490 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
314a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
314b0 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
314c0 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
314d0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
314e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
314f0 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
31500 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
31510 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
31520 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
31530 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
31540 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
31550 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
31560 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
31570 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
31580 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
31590 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
315a0 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
315b0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
315c0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
315d0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
315e0 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
315f0 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
31600 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
31610 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
31620 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
31630 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
31640 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
31650 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
31660 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
31670 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
31680 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
31690 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
316a0 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
316b0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
316c0 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
316d0 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
316e0 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
316f0 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
31700 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
31710 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
31720 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
31730 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
31740 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
31750 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31760 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
31770 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
31780 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
31790 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
317a0 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
317b0 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
317c0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
317d0 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
317e0 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
317f0 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
31800 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
31810 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
31820 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
31830 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
31840 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
31850 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
31860 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
31870 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
31880 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
31890 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
318a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
318b0 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
318c0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
318d0 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
318e0 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
318f0 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
31900 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
31910 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
31920 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
31930 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
31940 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
31950 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
31960 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
31970 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
31980 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
31990 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
319a0 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
319b0 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
319c0 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
319d0 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  d->aOvfl[0].idx 
319e0 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30  : -1);.    j = 0
319f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31a10 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73   Current 'old' s
31a20 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
31a30 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20     k = 0;       
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
31a60 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70   'new' sibling p
31a70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  age */.    for(i
31a80 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72  =0; i<nCell && r
31a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
31aa0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
31ab0 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
31ac0 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
31ad0 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
31ae0 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
31af0 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
31b00 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
31b10 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
31b20 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
31b30 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
31b40 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
31b50 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
31b60 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
31b70 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
31b80 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
31b90 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
31ba0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20  */.        pOld 
31bb0 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20  = apCopy[++j];. 
31bc0 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20         iNextOld 
31bd0 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
31be0 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  + pOld->nCell + 
31bf0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
31c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c  .        if( pOl
31c10 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
31c20 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66            nOverf
31c30 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
31c40 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  rflow;.         
31c50 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b   iOverflow = i +
31c60 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
31c70 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b  d->aOvfl[0].idx;
31c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31c90 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
31ca0 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
31cb0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31cc0 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
31cd0 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
31ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
31cf0 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
31d00 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
31d10 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
31d20 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  dx-1);.      ass
31d30 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
31d40 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  || pOld->aOvfl[1
31d50 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
31d60 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[2].idx-1);.  
31d70 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72      if( i==iOver
31d80 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
31d90 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20  isDivider = 1;. 
31da0 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f         if( (--nO
31db0 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20  verflow)>0 ){.  
31dc0 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
31dd0 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w++;.        }. 
31de0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
31df0 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29  ( i==cntNew[k] )
31e00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
31e10 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
31e20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
31e30 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
31e40 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20  ell on new.     
31e50 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
31e60 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62  ge k. If the sib
31e70 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
31e80 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
31e90 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
31ea0 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
31eb0 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65  ll i is a divide
31ec0 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  r cell.  */.    
31ed0 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
31ee0 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++k];.        i
31ef0 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63  f( !leafData ) c
31f00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
31f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
31f20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
31f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
31f40 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73  nOld );.      as
31f50 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a  sert( k<nNew );.
31f60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
31f70 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e   cell was origin
31f80 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c  ally divider cel
31f90 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f  l (and is not no
31fa0 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  w) or.      ** a
31fb0 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
31fc0 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20   or if the cell 
31fd0 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
31fe0 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69   different sibli
31ff0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ng.      ** page
32000 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61   before the bala
32010 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  ncing, then the 
32020 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
32030 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ies associated. 
32040 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79       ** with any
32050 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
32060 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ow pages need to
32070 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f   be updated.  */
32080 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76  .      if( isDiv
32090 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67  ider || pOld->pg
320a0 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
320b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  {.        if( !l
320c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
320d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
320e0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
320f0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
32100 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
32110 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
32120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32130 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70   if( szCell[i]>p
32140 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26  New->minLocal &&
32150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32160 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32170 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
32180 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69  r(pNew, apCell[i
32190 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
321a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
321b0 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
321c0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  tion ){.      fo
321d0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
321e0 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b 20  E_OK && i<nNew; 
321f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i++){.        rc
32200 20 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09 20   = ptrmapPut(.. 
32210 20 20 20 70 42 74 2c 20 67 65 74 34 62 79 74 65     pBt, get4byte
32220 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74  (&apNew[i]->aDat
32230 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  a[8]), PTRMAP_BT
32240 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  REE, apNew[i]->p
32250 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
32260 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f    }..#if 0.    /
32270 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63  * The ptrmapChec
32280 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e  kPages() contain
32290 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  s assert() state
322a0 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66  ments that verif
322b0 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c  y that.    ** al
322c0 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  l pointer map pa
322d0 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72  ges are set corr
322e0 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68  ectly. This is h
322f0 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20  elpful while .  
32300 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20    ** debugging. 
32310 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
32320 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65  disabled because
32330 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
32340 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63  ase may.    ** c
32350 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29  ause an assert()
32360 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61   statement to fa
32370 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d  il.  */.    ptrm
32380 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e  apCheckPages(apN
32390 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70  ew, nNew);.    p
323a0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
323b0 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65  &pParent, 1);.#e
323c0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ndif.  }..  asse
323d0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
323e0 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28  nit );.  TRACE((
323f0 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
32400 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  ed: old=%d new=%
32410 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
32420 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e           nOld, n
32430 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20  New, nCell));.. 
32440 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
32450 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
32460 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
32470 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
32480 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
32490 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
324a0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
324b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
324c0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
324d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
324e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
324f0 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
32500 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
32510 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
32520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32530 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
32540 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
32550 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
32560 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28  is.** overfull (
32570 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
32580 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
32590 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69  .**.** A new chi
325a0 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ld page is alloc
325b0 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e  ated and the con
325c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72  tents of the cur
325d0 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  rent root.** pag
325e0 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65  e, including ove
325f0 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65  rflow cells, are
32600 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
32610 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74   child. The root
32620 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e  .** page is then
32630 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20   overwritten to 
32640 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79  make it an empty
32650 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72   page with the r
32660 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70  ight-child .** p
32670 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
32680 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
32690 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
326a0 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69  turning, all poi
326b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
326c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
326d0 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74  o pages .** that
326e0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70   the new child-p
326f0 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  age now contains
32700 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65   pointers to are
32710 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a   updated. The.**
32720 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e   entry correspon
32730 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ding to the new 
32740 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
32750 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a  ter of the root.
32760 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  ** page is also 
32770 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  updated..**.** I
32780 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
32790 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
327a0 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72   contain a refer
327b0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c  ence to the chil
327c0 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53  d .** page and S
327d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
327e0 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
327f0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  se the caller is
32800 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
32810 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
32820 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65  () on *ppChild e
32830 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20  xactly once. If 
32840 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
32850 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
32860 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
32870 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  d *ppChild is se
32880 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
32890 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
328a0 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52  eper(MemPage *pR
328b0 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70  oot, MemPage **p
328c0 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72  pChild){.  int r
328d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
328e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
328f0 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
32900 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
32910 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
32920 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
32930 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
32940 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
32950 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
32960 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
32970 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
32980 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
32990 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
329a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52  Shared *pBt = pR
329b0 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  oot->pBt;    /* 
329c0 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20  The BTree */..  
329d0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e  assert( pRoot->n
329e0 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
329f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
32a00 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
32a10 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
32a20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20  Make pRoot, the 
32a30 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
32a40 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c   b-tree, writabl
32a50 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  e. Allocate a ne
32a60 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61  w .  ** page tha
32a70 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
32a80 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
32a90 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79  d of pPage. Copy
32aa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
32ab0 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73  ** of the node s
32ac0 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69  tored on pRoot i
32ad0 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c  nto the new chil
32ae0 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  d page..  */.  i
32af0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
32b00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32b10 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
32b20 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Page)).   || SQL
32b30 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 61 6c  ITE_OK!=(rc = al
32b40 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
32b50 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
32b60 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
32b70 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53 51 4c  no,0)).   || SQL
32b80 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6f  ITE_OK!=(rc = co
32b90 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  pyNodeContent(pR
32ba0 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a 20 20  oot, pChild)).  
32bb0 20 7c 7c 20 28 49 53 41 55 54 4f 56 41 43 55 55   || (ISAUTOVACUU
32bc0 4d 20 26 26 20 0a 20 20 20 20 20 20 20 53 51 4c  M && .       SQL
32bd0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 70 74  ITE_OK!=(rc = pt
32be0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
32bf0 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
32c00 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
32c10 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  o))).  ){.    *p
32c20 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20  pChild = 0;.    
32c30 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
32c40 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
32c50 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
32c60 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
32c70 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
32c80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
32c90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
32ca0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32cb0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
32cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
32cd0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f  ild->nCell==pRoo
32ce0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54  t->nCell );..  T
32cf0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
32d00 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
32d10 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e  o %d\n", pRoot->
32d20 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
32d30 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79  no));..  /* Copy
32d40 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
32d50 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74  lls from pRoot t
32d60 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65  o pChild */.  me
32d70 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
32d80 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  fl, pRoot->aOvfl
32d90 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  , pRoot->nOverfl
32da0 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d  ow*sizeof(pRoot-
32db0 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
32dc0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
32dd0 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66   = pRoot->nOverf
32de0 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  low;..  /* Zero 
32df0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32e00 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74  pRoot. Then inst
32e10 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68  all pChild as th
32e20 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a  e right-child. *
32e30 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  /.  zeroPage(pRo
32e40 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ot, pChild->aDat
32e50 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
32e60 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
32e70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
32e80 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
32e90 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20   pgnoChild);..  
32ea0 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c  *ppChild = pChil
32eb0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
32ec0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
32ed0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
32ee0 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
32ef0 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
32f00 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
32f10 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
32f20 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
32f30 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
32f40 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
32f50 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
32f60 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
32f70 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
32f80 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
32f90 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
32fa0 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61  ** routine. Bala
32fb0 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  ncing routines a
32fc0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61  re:.**.**   bala
32fd0 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20  nce_quick().**  
32fe0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
32ff0 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e  ).**   balance_n
33000 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74  onroot().*/.stat
33010 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
33020 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
33030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33040 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  E_OK;.  const in
33050 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70  t nMin = pCur->p
33060 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a  Bt->usableSize *
33070 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61   2 / 3;.  u8 aBa
33080 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
33090 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  13];.  u8 *pFree
330a0 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c   = 0;..  TESTONL
330b0 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  Y( int balance_q
330c0 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20  uick_called = 0 
330d0 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  );.  TESTONLY( i
330e0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
330f0 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  r_called = 0 );.
33100 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
33110 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
33120 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  age;.    MemPage
33130 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
33140 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a  apPage[iPage];..
33150 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30      if( iPage==0
33160 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
33170 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
33180 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
33190 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
331a0 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72  e b-tree is over
331b0 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  full. In this ca
331c0 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20  se call the.    
331d0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64      ** balance_d
331e0 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  eeper() function
331f0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
33200 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72   child for the r
33210 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
33220 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65   ** and copy the
33230 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
33240 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  s of the root-pa
33250 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20  ge to it. The.  
33260 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74        ** next it
33270 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
33280 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
33290 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61  nce the child pa
332a0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a  ge..        */ .
332b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
332c0 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f  (balance_deeper_
332d0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
332e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
332f0 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
33300 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e, &pCur->apPage
33310 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
33320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ){.          pCu
33340 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20  r->iPage = 1;.  
33350 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
33360 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
33370 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
33380 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[1] = 0;.      
33390 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
333a0 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76  ->apPage[1]->nOv
333b0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20  erflow );.      
333c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
333d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
333e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
333f0 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76  e if( pPage->nOv
33400 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
33410 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20  ge->nFree<=nMin 
33420 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
33430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33440 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74   MemPage * const
33450 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
33460 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d  >apPage[iPage-1]
33470 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
33480 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  t iIdx = pCur->a
33490 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a  iIdx[iPage-1];..
334a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
334b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
334c0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
334d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
334e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64  LITE_OK ){.#ifnd
334f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
33500 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20  UICKBALANCE.    
33510 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
33520 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20  asData.         
33530 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
33540 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  low==1.         
33550 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  && pPage->aOvfl[
33560 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
33570 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26  Cell.         &&
33580 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
33590 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
335a0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49  arent->nCell==iI
335b0 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  dx.        ){.  
335c0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
335d0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
335e0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
335f0 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65  sibling of pPage
33600 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   on which.      
33610 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20      ** to store 
33620 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33630 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  l. balance_quick
33640 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77  () inserts a new
33650 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   cell.          
33660 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c  ** into pParent,
33670 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
33680 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f   pParent overflo
33690 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20  w. If this.     
336a0 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
336b0 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61   the next intera
336c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
336d0 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
336e0 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20   pParent .      
336f0 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65      ** use eithe
33700 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  r balance_nonroo
33710 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64  t() or balance_d
33720 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74  eeper(). Until t
33730 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
33740 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76   happens, the ov
33750 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73  erflow cell is s
33760 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61  tored in the aBa
33770 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
33780 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ].          ** b
33790 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20  uffer. .        
337a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
337b0 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66  * The purpose of
337c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
337d0 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68  ssert() is to ch
337e0 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a  eck that only a.
337f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
33800 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  gle call to bala
33810 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d  nce_quick() is m
33820 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ade for each cal
33830 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
33840 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
33850 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f   If this were no
33860 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75  t verified, a su
33870 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69  btle bug involvi
33880 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20  ng reuse.       
33890 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61     ** of the aBa
338a0 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
338b0 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e  ] might sneak in
338c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
338d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
338e0 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f   (balance_quick_
338f0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
33900 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
33910 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
33920 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61  rent, pPage, aBa
33930 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29  lanceQuickSpace)
33940 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
33950 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
33960 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
33970 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c   this case, call
33980 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
33990 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75  () to redistribu
339a0 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  te cells.       
339b0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50     ** between pP
339c0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20  age and up to 2 
339d0 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70  of its sibling p
339e0 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c  ages. This invol
339f0 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ves.          **
33a00 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
33a10 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65  ontents of pPare
33a20 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
33a30 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20  use pParent to. 
33a40 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f           ** beco
33a50 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
33a60 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65  nderfull. The ne
33a70 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
33a80 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20  the do-loop.    
33a90 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61        ** will ba
33aa0 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
33ab0 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74   page to correct
33ac0 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20   this..         
33ad0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a   ** .          *
33ae0 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20  * If the parent 
33af0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
33b00 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66  rfull, the overf
33b10 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c  low cell or cell
33b20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
33b30 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
33b40 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61   pSpace buffer a
33b50 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61  llocated immedia
33b60 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20  tely below. .   
33b70 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73         ** A subs
33b80 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
33b90 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
33ba0 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74  will deal with t
33bb0 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20  his by.         
33bc0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61   ** calling bala
33bd0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62  nce_nonroot() (b
33be0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
33bf0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69  may be called fi
33c00 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  rst,.          *
33c10 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74  * but it doesn't
33c20 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66   deal with overf
33c30 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74  low cells - just
33c40 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61   moves them to a
33c50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
33c60 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f  fferent page). O
33c70 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75  nce this subsequ
33c80 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ent call to bala
33c90 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20  nce_nonroot() . 
33ca0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
33cb0 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73  completed, it is
33cc0 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65   safe to release
33cd0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
33ce0 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20  er used by.     
33cf0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76       ** the prev
33d00 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68  ious call, as th
33d10 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
33d20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62  data will have b
33d30 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  een .          *
33d40 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20  * copied either 
33d50 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
33d60 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
33d70 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   or into the new
33d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53  .          ** pS
33d90 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73  pace buffer pass
33da0 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72  ed to the latter
33db0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
33dc0 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20  _nonroot()..    
33dd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
33de0 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
33df0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
33e00 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67  c(pCur->pBt->pag
33e10 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
33e20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
33e30 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20  onroot(pParent, 
33e40 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50  iIdx, pSpace, iP
33e50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20  age==1);.       
33e60 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
33e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33e80 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
33e90 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
33ea0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
33eb0 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
33ec0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
33ed0 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
33ee0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33ef0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
33f00 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
33f10 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
33f20 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
33f30 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
33f40 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
33f50 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
33f60 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
33f70 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
33f80 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
33f90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
33fa0 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
33fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
33fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33fd0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77   pSpace buffer w
33fe0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74  ill be freed aft
33ff0 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  er the next call
34000 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
34010 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34020 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f  (), or just befo
34030 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
34040 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65   returns, whiche
34050 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
34060 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f   comes first. */
34070 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65  .          pFree
34080 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20   = pSpace;.     
34090 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
340a0 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
340b0 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20  flow = 0;..     
340c0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65   /* The next ite
340d0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
340e0 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74  -loop balances t
340f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
34100 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
34110 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
34120 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
34130 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
34140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34150 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20  );..  if( pFree 
34160 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
34170 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
34180 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34190 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  }.../*.** Insert
341a0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
341b0 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
341c0 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
341d0 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
341e0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
341f0 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
34200 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
34210 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
34220 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
34230 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
34240 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
34250 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
34260 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
34270 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
34280 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
34290 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
342a0 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
342b0 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
342c0 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
342d0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
342e0 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
342f0 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
34300 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
34310 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
34320 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
34330 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
34340 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
34350 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
34360 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
34370 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61  to.** MovetoUnpa
34380 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63  cked() to seek c
34390 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70  ursor pCur to (p
343a0 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61  Key, nKey) has a
343b0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
343c0 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65  erformed. seekRe
343d0 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72  sult is the sear
343e0 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  ch result return
343f0 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a  ed (a negative.*
34400 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72  * number if pCur
34410 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e   points at an en
34420 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c  try that is smal
34430 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20  ler than (pKey, 
34440 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70  nKey), or.** a p
34450 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
34460 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
34470 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20  an etry that is 
34480 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
34490 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a  (pKey, nKey)). .
344a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
344b0 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
344c0 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72  r is 0, then cur
344d0 73 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69  sor pCur may poi
344e0 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e  nt to any .** en
344f0 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74  try or to no ent
34500 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68  ry at all. In th
34510 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
34520 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65  ction has to see
34530 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  k.** the cursor 
34540 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b  before the new k
34550 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74  ey can be insert
34560 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
34570 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
34580 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
34590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345a0 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
345b0 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
345c0 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
345d0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
345e0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
345f0 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
34600 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
34610 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
34620 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
34630 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
34640 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
34650 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
34660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34670 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34680 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
34690 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
346a0 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
346b0 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  Bias,           
346c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
346d0 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
346e0 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e  n append */.  in
346f0 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20  t seekResult    
34700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34710 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
34720 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
34730 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   call */.){.  in
34740 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20  t rc;.  int loc 
34750 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20  = seekResult;.  
34760 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74  int szNew;.  int
34770 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
34780 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
34790 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
347a0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
347b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
347c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
347d0 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
347e0 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
347f0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
34800 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
34810 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
34820 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
34830 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
34840 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
34850 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
34860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
34870 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61  r->wrFlag );.  a
34880 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
34890 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
348a0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
348b0 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  , pCur->pKeyInfo
348c0 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a  !=0, 2) );..  /*
348d0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
348e0 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62  nsert into a tab
348f0 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c  le b-tree, inval
34900 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
34910 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  ob .  ** cursors
34920 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77   open on the row
34930 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
34940 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69  (assuming this i
34950 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  s a replace.  **
34960 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20   operation - if 
34970 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66  it is not, the f
34980 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
34990 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  -op).  */.  if( 
349a0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
349b0 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  0 ){.    invalid
349c0 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
349d0 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  rs(p, pCur->pgno
349e0 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a  Root, nKey, 0);.
349f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
34a00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
34a10 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
34a20 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
34a30 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
34a40 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
34a50 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
34a60 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
34a70 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
34a80 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
34a90 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  he call to btree
34aa0 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
34ab0 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
34ac0 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
34ad0 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
34ae0 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
34af0 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
34b00 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
34b10 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
34b20 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
34b30 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
34b40 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
34b50 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
34b60 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
34b70 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
34b80 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
34b90 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
34ba0 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
34bb0 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
34bc0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74   In this case bt
34bd0 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f  reeMoveto() reco
34be0 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74  gnizes.  ** that
34bf0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
34c00 6c 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20  lready where it 
34c10 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20  needs to be and 
34c20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a  returns without.
34c30 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77    ** doing any w
34c40 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68  ork. To avoid th
34c50 77 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70  warting these op
34c60 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20  timizations, it 
34c70 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a  is important.  *
34c80 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74  * not to clear t
34c90 68 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a  he cursor here..
34ca0 20 20 2a 2f 0a 20 20 69 66 28 0a 20 20 20 20 53    */.  if(.    S
34cb0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
34cc0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
34cd0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
34ce0 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 20 28 21  ot, pCur)) || (!
34cf0 6c 6f 63 20 26 26 0a 20 20 20 20 53 51 4c 49 54  loc &&.    SQLIT
34d00 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
34d10 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b  eMoveto(pCur, pK
34d20 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64  ey, nKey, append
34d30 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29  Bias, &loc)).  )
34d40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
34d50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
34d60 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
34d70 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
34d80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34d90 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c  SOR_INVALID && l
34da0 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20  oc) );..  pPage 
34db0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
34dc0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
34dd0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
34de0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
34df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34e00 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
34e10 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
34e20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
34e30 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
34e40 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
34e50 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
34e60 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
34e70 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
34e80 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
34e90 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
34ea0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
34eb0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
34ec0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34ed0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
34ee0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
34ef0 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
34f00 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
34f10 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
34f20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
34f30 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
34f40 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
34f50 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
34f60 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
34f70 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
34f80 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
34f90 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
34fa0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
34fb0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
34fc0 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
34fd0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
34fe0 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
34ff0 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
35000 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
35010 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
35020 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20  c==0 ){.    u16 
35030 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72  szOld;.    asser
35040 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  t( idx<pPage->nC
35050 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
35060 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35070 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
35090 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
350a0 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
350b0 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
350c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
350d0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
350e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
350f0 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
35100 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
35110 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
35120 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
35130 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
35140 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
35150 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
35160 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35170 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
35180 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28    rc = dropCell(
35190 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c  pPage, idx, szOl
351a0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
351b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
351c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
351d0 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ert;.    }.  }el
351e0 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
351f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
35200 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35210 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
35220 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
35230 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
35240 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
35250 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
35260 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  eaf );.  }.  rc 
35270 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
35280 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ge, idx, newCell
35290 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
352a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
352b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
352c0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61  ->nCell>0 || pPa
352d0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
352e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65  );..  /* If no e
352f0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
35300 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61   and pPage has a
35310 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
35320 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20   call balance() 
35330 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72  .  ** to redistr
35340 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ibute the cells 
35350 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e  within the tree.
35360 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29   Since balance()
35370 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74   may move.  ** t
35380 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20  he cursor, zero 
35390 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  the BtCursor.inf
353a0 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75  o.nSize and BtCu
353b0 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20  rsor.validNKey. 
353c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20   ** variables.. 
353d0 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75   **.  ** Previou
353e0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
353f0 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65  Lite called move
35400 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65  ToRoot() to move
35410 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a   the cursor.  **
35420 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f   back to the roo
35430 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63  t page as balanc
35440 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61  e() used to inva
35450 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65  lidate the conte
35460 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75  nts.  ** of BtCu
35470 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e  rsor.apPage[] an
35480 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  d BtCursor.aiIdx
35490 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  []. Instead of d
354a0 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20  oing that,.  ** 
354b0 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73  set the cursor s
354c0 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64  tate to "invalid
354d0 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f  ". This makes co
354e0 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72  mmon insert oper
354f0 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67  ations.  ** slig
35500 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a  htly faster..  *
35510 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20  *.  ** There is 
35520 61 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70  a subtle but imp
35530 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ortant optimizat
35540 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68  ion here too. Wh
35550 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a  en inserting.  *
35560 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72  * multiple recor
35570 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65  ds into an intke
35580 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61  y b-tree using a
35590 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28   single cursor (
355a0 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70  as can.  ** happ
355b0 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  en while process
355c0 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49  ing an "INSERT I
355d0 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20  NTO ... SELECT" 
355e0 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20  statement), it. 
355f0 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65   ** is advantage
35600 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65  ous to leave the
35610 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
35620 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
35630 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62  ry in.  ** the b
35640 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c  -tree if possibl
35650 65 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  e. If the cursor
35660 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
35670 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20  g to the last.  
35680 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
35690 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e  table, and the n
356a0 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64  ext row inserted
356b0 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20   has an integer 
356c0 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20  key.  ** larger 
356d0 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
356e0 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69   existing key, i
356f0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
35700 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a   insert the.  **
35710 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65   row without see
35720 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e  king the cursor.
35730 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62   This can be a b
35740 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ig performance b
35750 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  oost..  */.  pCu
35760 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
35770 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
35780 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
35790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
357a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
357b0 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61  w ){.    rc = ba
357c0 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20  lance(pCur);..  
357d0 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73    /* Must make s
357e0 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ure nOverflow is
357f0 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65   reset to zero e
35800 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e  ven if the balan
35810 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c  ce().    ** fail
35820 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  s. Internal data
35830 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
35840 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
35850 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20  t otherwise. .  
35860 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74    ** Also, set t
35870 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
35880 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73  to invalid. This
35890 20 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f   stops saveCurso
358a0 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20  rPosition().    
358b0 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
358c0 6f 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  o save the curre
358d0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
358e0 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20  he cursor.  */. 
358f0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
35900 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f  pCur->iPage]->nO
35910 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
35920 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
35930 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
35940 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
35950 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
35960 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
35970 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e  ow==0 );..end_in
35980 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
35990 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
359a0 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
359b0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
359c0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
359d0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
359e0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
359f0 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
35a00 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
35a10 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
35a20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
35a30 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
35a40 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
35a50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35a60 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
35a70 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20     .  int rc;   
35a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35aa0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
35ab0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ad0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64      /* Page to d
35ae0 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20  elete cell from 
35af0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
35b00 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  ar *pCell;      
35b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
35b20 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20  nter to cell to 
35b30 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
35b40 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20  iCellIdx;       
35b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c   /* Index of cel
35b70 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
35b80 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b   int iCellDepth;
35b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ba0 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f        /* Depth o
35bb0 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e  f node containin
35bc0 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61  g pCell */ ..  a
35bd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35be0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35bf0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
35c00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
35c10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
35c20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
35c30 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
35c40 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
35c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61   );.  assert( ha
35c60 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
35c70 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70  eLock(p, pCur->p
35c80 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70  gnoRoot, pCur->p
35c90 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29  KeyInfo!=0, 2) )
35ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73  ;.  assert( !has
35cb0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
35cc0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29   pCur->pgnoRoot)
35cd0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
35ce0 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  (pCur->aiIdx[pCu
35cf0 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d  r->iPage]>=pCur-
35d00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
35d10 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20  age]->nCell) .  
35d20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
35d30 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
35d40 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72  ALID).  ){.    r
35d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35d60 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  OR;  /* Somethin
35d70 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e  g has gone awry.
35d80 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   */.  }..  /* If
35d90 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
35da0 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72  e operation to r
35db0 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d  emove a row from
35dc0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
35dd0 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  .  ** invalidate
35de0 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
35df0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
35e00 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65  e row being dele
35e10 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ted.  */.  if( p
35e20 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
35e30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
35e40 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
35e50 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
35e60 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  oot, pCur->info.
35e70 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
35e80 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43   iCellDepth = pC
35e90 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65  ur->iPage;.  iCe
35ea0 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  llIdx = pCur->ai
35eb0 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b  Idx[iCellDepth];
35ec0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
35ed0 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
35ee0 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  th];.  pCell = f
35ef0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
35f00 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20  CellIdx);..  /* 
35f10 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  If the page cont
35f20 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79  aining the entry
35f30 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
35f40 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d  t a leaf page, m
35f50 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
35f60 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65  sor to the large
35f70 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
35f80 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61  tree that is sma
35f90 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74  ller than.  ** t
35fa0 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64  he entry being d
35fb0 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c  eleted. This cel
35fc0 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74  l will replace t
35fd0 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  he cell being de
35fe0 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  leted.  ** from 
35ff0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
36000 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73  e. The 'previous
36010 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20  ' entry is used 
36020 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64  for this instead
36030 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65  .  ** of the 'ne
36040 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68  xt' entry, as th
36050 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
36060 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72   is always a par
36070 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t of the.  ** su
36080 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79  b-tree headed by
36090 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
360a0 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  of the cell bein
360b0 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
360c0 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e  makes.  ** balan
360d0 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f  cing the tree fo
360e0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65  llowing the dele
360f0 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73  te operation eas
36100 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ier.  */.  if( !
36110 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
36120 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
36130 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
36140 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
36150 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
36160 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20 29  ur, &notUsed)) )
36170 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
36180 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
36190 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
361a0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
361b0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
361c0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62 65  on this table be
361d0 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67  fore.  ** making
361e0 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
361f0 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67  ns. Make the pag
36200 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
36210 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20   entry to be .  
36220 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74 61  ** deleted writa
36230 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61  ble. Then free a
36240 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
36250 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
36260 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72  h the .  ** entr
36270 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65  y and finally re
36280 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74  move the cell it
36290 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e  self from within
362a0 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20   the page.  */. 
362b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
362c0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
362d0 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
362e0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
362f0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
36300 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
36310 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
36320 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c  >pDbPage)).   ||
36330 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
36340 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
36350 65 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c 7c  e, pCell)).   ||
36360 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
36370 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
36380 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c  , iCellIdx, cell
36390 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
363a0 43 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20 20  Cell))).  ){.   
363b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
363c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
363d0 6c 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f  l deleted was no
363e0 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c  t located on a l
363f0 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74  eaf page, then t
36400 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69  he cursor.  ** i
36410 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
36420 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67  ting to the larg
36430 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  est entry in the
36440 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
36450 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69  .  ** by the chi
36460 6c 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63  ld-page of the c
36470 65 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73  ell that was jus
36480 74 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  t deleted from a
36490 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20  n internal.  ** 
364a0 6e 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66  node. The cell f
364b0 72 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  rom the leaf nod
364c0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  e needs to be mo
364d0 76 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ved to the inter
364e0 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f  nal.  ** node to
364f0 20 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c   replace the del
36500 65 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  eted cell.  */. 
36510 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
36520 66 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  f ){.    MemPage
36530 20 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e   *pLeaf = pCur->
36540 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
36550 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  ge];.    int nCe
36560 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d  ll;.    Pgno n =
36570 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43   pCur->apPage[iC
36580 65 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e  ellDepth+1]->pgn
36590 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
365a0 63 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20  char *pTmp;..   
365b0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
365c0 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e  l(pLeaf, pLeaf->
365d0 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43  nCell-1);.    nC
365e0 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
365f0 72 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b  r(pLeaf, pCell);
36600 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f  .    assert( MX_
36610 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d  CELL_SIZE(pBt)>=
36620 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c  nCell );..    al
36630 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
36640 70 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d  pBt);.    pTmp =
36650 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
36660 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
36670 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
36680 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65  e3PagerWrite(pLe
36690 61 66 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20  af->pDbPage)) . 
366a0 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
366b0 21 3d 28 72 63 20 3d 20 69 6e 73 65 72 74 43 65  !=(rc = insertCe
366c0 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
366d0 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65  dx, pCell-4, nCe
366e0 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29 0a  ll+4, pTmp, n)).
366f0 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
36700 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c  K!=(rc = dropCel
36710 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e  l(pLeaf, pLeaf->
36720 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29  nCell-1, nCell))
36730 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
36740 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
36750 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65   }..  /* Balance
36760 20 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68   the tree. If th
36770 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20  e entry deleted 
36780 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
36790 20 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a   leaf page,.  **
367a0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
367b0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
367c0 20 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74   that page. In t
367d0 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72  his case the fir
367e0 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  st.  ** call to 
367f0 62 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72  balance() repair
36800 73 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20  s the tree, and 
36810 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64  the if(...) cond
36820 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65  ition is.  ** ne
36830 76 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20  ver true..  **. 
36840 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
36850 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65  f the entry dele
36860 74 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e  ted was on an in
36870 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65  ternal node page
36880 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72  , then.  ** pCur
36890 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
368a0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72  the leaf page fr
368b0 6f 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20  om which a cell 
368c0 77 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20  was removed to. 
368d0 20 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20   ** replace the 
368e0 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f  cell deleted fro
368f0 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  m the internal n
36900 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69  ode. This is sli
36910 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b  ghtly.  ** trick
36920 79 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f  y as the leaf no
36930 64 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66  de may be underf
36940 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74  ull, and the int
36950 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20  ernal node may. 
36960 20 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e   ** be either un
36970 64 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e  der or overfull.
36980 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75   In this case ru
36990 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
369a0 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f  algorithm.  ** o
369b0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
369c0 66 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61  first. If the ba
369d0 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66  lance proceeds f
369e0 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65  ar enough up the
369f0 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20  .  ** tree that 
36a00 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  we can be sure t
36a10 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20  hat any problem 
36a20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  in the internal 
36a30 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  node has.  ** be
36a40 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f  en corrected, so
36a50 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73   be it. Otherwis
36a60 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  e, after balanci
36a70 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  ng the leaf node
36a80 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20  ,.  ** walk the 
36a90 63 75 72 73 6f 72 20 75 70 20 74 68 65 20 74 72  cursor up the tr
36aa0 65 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ee to the intern
36ab0 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61  al node and bala
36ac0 6e 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20  nce it as .  ** 
36ad0 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  well.  */.  rc =
36ae0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
36af0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36b00 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61  _OK && pCur->iPa
36b10 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b  ge>iCellDepth ){
36b20 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
36b30 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70  ->iPage>iCellDep
36b40 74 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  th ){.      rele
36b50 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
36b60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
36b70 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  --]);.    }.    
36b80 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
36b90 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  r);.  }..  if( r
36ba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36bb0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
36bc0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
36bd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36be0 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
36bf0 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
36c00 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
36c10 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
36c20 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
36c30 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
36c40 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
36c50 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
36c60 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
36c70 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
36c80 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
36c90 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
36ca0 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
36cb0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
36cc0 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
36cd0 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
36ce0 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
36cf0 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
36d00 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
36d10 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
36d20 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
36d30 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
36d40 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
36d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d60 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
36d70 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ices.*/.static i
36d80 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61  nt btreeCreateTa
36d90 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
36da0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
36db0 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
36dc0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
36dd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
36de0 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
36df0 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  oot;.  int rc;..
36e00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36e10 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
36e20 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
36e30 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
36e40 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
36e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
36e60 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
36e70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
36e80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36e90 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
36ea0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
36eb0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
36ec0 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  1, 0);.  if( rc 
36ed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
36ee0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66  ;.  }.#else.  if
36ef0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36f00 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
36f10 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
36f20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
36f30 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
36f40 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
36f50 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
36f60 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
36f70 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
36f80 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72  o. */..    /* Cr
36f90 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  eating a new tab
36fa0 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20  le may probably 
36fb0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
36fc0 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
36fd0 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ase.    ** to ma
36fe0 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
36ff0 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20  new tables root 
37000 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68  page. In case th
37010 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20  is page turns.  
37020 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61    ** out to be a
37030 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
37040 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72   delete all over
37050 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61  flow page-map ca
37060 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64  ches.    ** held
37070 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   by open cursors
37080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76  ..    */.    inv
37090 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
370a0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20  owCache(pBt);.. 
370b0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
370c0 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
370d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
370e0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
370f0 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
37100 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
37110 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
37120 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
37130 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
37140 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
37150 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
37160 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
37170 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
37180 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
37190 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
371a0 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45  a(p, BTREE_LARGE
371b0 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70  ST_ROOT_PAGE, &p
371c0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67  gnoRoot);.    pg
371d0 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
371e0 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
371f0 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
37200 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
37210 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
37220 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
37230 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
37240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
37250 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
37260 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
37270 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
37280 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
37290 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
372a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
372b0 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
372c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
372d0 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
372e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
372f0 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
37300 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
37310 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
37320 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
37330 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
37340 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
37350 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
37360 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
37370 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
37380 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
37390 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
373a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
373b0 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
373c0 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
373d0 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
373e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
373f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
37400 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
37410 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
37420 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
37430 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
37440 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
37450 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
37460 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
37470 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
37480 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
37490 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
374a0 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
374b0 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
374c0 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
374d0 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
374e0 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
374f0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
37500 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
37510 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
37520 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
37530 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
37540 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
37550 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
37560 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37570 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
37580 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
37590 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
375a0 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
375b0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
375c0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
375d0 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
375e0 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
375f0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
37600 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
37610 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
37620 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
37650 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
37660 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70  ptrmapGet(pBt, p
37670 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c  gnoRoot, &eType,
37680 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
37690 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
376a0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c  RMAP_ROOTPAGE ||
376b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
376c0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
376d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
376e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
376f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
37700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37710 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
37720 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
37730 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
37750 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
37760 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
37770 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
37780 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe!=PTRMAP_FREEP
37790 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  AGE );.      rc 
377a0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
377b0 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65  Bt, pRoot, eType
377c0 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f  , iPtrPage, pgno
377d0 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
377e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
377f0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62  t);..      /* Ob
37800 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74  tain the page at
37810 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20   pgnoRoot */.   
37820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37840 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37850 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74   }.      rc = bt
37860 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
37870 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
37880 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
37890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
378a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
378b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
378c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
378d0 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
378e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
378f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37900 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
37910 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
37920 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37930 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
37940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
37950 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
37960 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
37970 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
37980 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
37990 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
379a0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
379b0 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
379c0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
379d0 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
379e0 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
379f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37a00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
37a10 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
37a20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
37a30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
37a40 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
37a50 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
37a60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37a70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
37a80 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
37a90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
37aa0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
37ab0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
37ac0 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
37ad0 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
37ae0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
37af0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
37b00 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
37b10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37b20 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
37b30 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
37b40 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
37b50 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
37b60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
37b70 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
37b80 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
37b90 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
37ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37bb0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
37bc0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
37bd0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
37be0 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
37bf0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
37c00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37c10 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
37c20 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
37c30 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
37c40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
37c50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
37c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37c70 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
37c80 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
37c90 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
37ca0 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
37cb0 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
37cc0 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
37cd0 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
37ce0 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
37cf0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
37d00 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
37d10 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
37d20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
37d30 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
37d40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37d50 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
37d60 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
37d70 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag,     /* Deall
37d80 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
37d90 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  ue */.  int *pnC
37da0 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61  hange.){.  MemPa
37db0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
37dc0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
37dd0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
37de0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
37df0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
37e00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
37e10 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
37e20 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
37e30 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
37e40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
37e50 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
37e60 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
37e70 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
37e80 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
37e90 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37ea0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37eb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
37ec0 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
37ed0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
37ee0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
37ef0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
37f00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
37f10 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
37f20 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
37f30 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e  te(pCell), 1, pn
37f40 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69  Change);.      i
37f50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
37f60 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
37f70 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
37f80 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
37f90 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
37fa0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
37fb0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
37fc0 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
37fd0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37fe0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
37ff0 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
38000 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
38010 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e  aData[8]), 1, pn
38020 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28  Change);.    if(
38030 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
38040 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
38050 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e  ;.  }else if( pn
38060 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73  Change ){.    as
38070 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
38080 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68  Key );.    *pnCh
38090 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e  ange += pPage->n
380a0 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Cell;.  }.  if( 
380b0 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
380c0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
380d0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
380e0 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69  e if( (rc = sqli
380f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
38100 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d  age->pDbPage))==
38110 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67  0 ){.    zeroPag
38120 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
38130 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c  aData[0] | PTF_L
38140 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72  EAF);.  }..clear
38150 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
38160 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
38170 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
38180 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
38190 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  lete all informa
381a0 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67  tion from a sing
381b0 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
381c0 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c  database.  iTabl
381d0 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  e is.** the page
381e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
381f0 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
38200 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
38210 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a  utine returns,.*
38220 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
38230 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74  is empty, but st
38240 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ill exists..**.*
38250 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
38260 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
38270 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
38280 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
38290 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72  n.** read cursor
382a0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s on the table. 
382b0 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73   Open write curs
382c0 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  ors are moved to
382d0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20   the.** root of 
382e0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
382f0 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20   If pnChange is 
38300 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
38310 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74  able iTable must
38320 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   be an intkey ta
38330 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ble. The.** inte
38340 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ger value pointe
38350 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65  d to by pnChange
38360 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
38370 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
38380 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74  .** entries in t
38390 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
383a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
383b0 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
383c0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
383d0 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20  t *pnChange){.  
383e0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
383f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
38400 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
38410 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
38420 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
38430 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a  TRANS_WRITE );..
38440 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20    /* Invalidate 
38450 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  all incrblob cur
38460 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 61 62  sors open on tab
38470 6c 65 20 69 54 61 62 6c 65 20 28 61 73 73 75 6d  le iTable (assum
38480 69 6e 67 20 69 54 61 62 6c 65 0a 20 20 2a 2a 20  ing iTable.  ** 
38490 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
384a0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2d 20   table b-tree - 
384b0 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  if it is not,