/ Hex Artifact Content
Login

Artifact 8f4c2ebdc9f0e0139f5878fac8ac96b12528b014:


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 35 35 20 32 30 30 39 2f 30  c,v 1.655 2009/0
0190: 37 2f 30 37 20 31 31 3a 33 39 3a 35 39 20 64 72  7/07 11:39:59 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
07c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
07d0: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
07e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
07f0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0800: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0810: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0820: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0830: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0840: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
0850: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0860: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0870: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0880: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0890: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08a0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08b0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08c0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08d0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08e0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08f0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0900: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0910: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0920: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0930: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0940: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0950: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0960: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0970: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0980: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0990: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09a0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
09f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a00: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a10: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a30: 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69  Locks(a).  #defi
0a40: 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  ne downgradeAllS
0a50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0a60: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0a70: 65 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  e hasSharedCache
0a80: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c  TableLock(a,b,c,
0a90: 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68  d) 1.  #define h
0aa0: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
0ab0: 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a  a, b) 0.#endif..
0ac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ad0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0ae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0af0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
0b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0b10: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0b20: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0b30: 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68 65 63  atement. It chec
0b40: 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 6e 65  ks.** that conne
0b50: 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20 74 68  ction p holds th
0b60: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
0b70: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
0b80: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62 2d 74  e to the .** b-t
0b90: 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ree with root pa
0ba0: 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73 6f 2c  ge iRoot. If so,
0bb0: 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
0bc0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  d. Otherwise, fa
0bd0: 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65 78 61  lse. .** For exa
0be0: 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69  mple, when writi
0bf0: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 2d  ng to a table b-
0c00: 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  tree with root-p
0c10: 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a  age iRoot via .*
0c20: 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69  * Btree connecti
0c30: 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  on pBtree:.**.**
0c40: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 53      assert( hasS
0c50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0c60: 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  ock(pBtree, iRoo
0c70: 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b  t, 0, WRITE_LOCK
0c80: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ) );.**.** When 
0c90: 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  writing to an in
0ca0: 64 65 78 20 62 2d 74 72 65 65 20 74 68 61 74 20  dex b-tree that 
0cb0: 72 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61  resides in a sha
0cc0: 72 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20  rable database, 
0cd0: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  the .** caller s
0ce0: 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74  hould have first
0cf0: 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b   obtained a lock
0d00: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20   specifying the 
0d10: 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
0d20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
0d30: 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  g table b-tree. 
0d40: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d50: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d60: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d80: 74 73 20 65 61 63 68 20 62 2d 74 72 65 65 20 61  ts each b-tree a
0d90: 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72  s a separate str
0da0: 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72  ucture. To deter
0db0: 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  mine.** the tabl
0dc0: 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65 73 70  e b-tree corresp
0dd0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
0de0: 64 65 78 20 62 2d 74 72 65 65 20 62 65 69 6e 67  dex b-tree being
0df0: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
0e00: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
0e10: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
0e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
0e30: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
0e40: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
0e50: 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
0e60: 65 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74  ed at page iRoot
0e70: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
0e80: 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65  .** hold a write
0e90: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
0ea0: 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20  ema table (root 
0eb0: 70 61 67 65 20 31 29 2e 20 54 68 69 73 20 69 73  page 1). This is
0ec0: 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61   also.** accepta
0ed0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0ee0: 6e 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68  nt hasSharedCach
0ef0: 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74  eTableLock(.  Bt
0f00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
0f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
0f20: 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f  hat must hold lo
0f30: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ck */.  Pgno iRo
0f40: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot,            /
0f50: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62  * Root page of b
0f60: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
0f70: 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  sIndex,         
0f80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f    /* True if iRo
0f90: 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f  ot is the root o
0fa0: 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  f an index b-tre
0fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b  e */.  int eLock
0fc0: 54 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Type          /*
0fd0: 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74   Required lock t
0fe0: 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  ype (READ_LOCK o
0ff0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f  r WRITE_LOCK) */
1000: 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  .){.  Schema *pS
1010: 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20  chema = (Schema 
1020: 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  *)pBtree->pBt->p
1030: 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69  Schema;.  Pgno i
1040: 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  Tab = 0;.  BtLoc
1050: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  k *pLock;..  /* 
1060: 49 66 20 74 68 69 73 20 62 2d 74 72 65 65 20 64  If this b-tree d
1070: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73  atabase is not s
1080: 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20  hareable, or if 
1090: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
10a0: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68  ading.  ** and h
10b0: 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  as the read-unco
10c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
10d0: 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69  , then no lock i
10e0: 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a  s required. .  *
10f0: 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1100: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   return true imm
1110: 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20 74 68  ediately.  If th
1120: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1130: 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77 72 69  ing .  ** or wri
1140: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
1150: 74 72 65 65 2c 20 62 75 74 20 74 68 65 20 73 63  tree, but the sc
1160: 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f 61 64  hema is not load
1170: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ed, then return.
1180: 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f 2e 20    ** true also. 
1190: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11a0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
11b0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 74 6f 6f  d, but it is too
11c0: 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a 2a 20   difficult.  ** 
11d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
11e0: 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  client actually 
11f0: 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73 20 64  holds it. This d
1200: 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20 76 65  oesn't happen ve
1210: 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e 20 20  ry.  ** often.  
1220: 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65 65  */.  if( (pBtree
1230: 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a 20  ->sharable==0). 
1240: 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65 3d    || (eLockType=
1250: 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28 70  =READ_LOCK && (p
1260: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1270: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1280: 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20 20 7c  committed)).   |
1290: 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20 28 21  | (isIndex && (!
12a0: 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68  pSchema || (pSch
12b0: 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63  ema->flags&DB_Sc
12c0: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 29  hemaLoaded)==0 )
12d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
12e0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
12f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1300: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1310: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
1320: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
1330: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
1340: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
1350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1360: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
1370: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1380: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1390: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
13a0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
13b0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
13c0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
13d0: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
13e0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
13f0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1400: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1410: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
1420: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
1430: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
1440: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
1450: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
1460: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
1470: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 52  ( pIdx->tnum==iR
1480: 6f 6f 74 20 29 7b 0a 09 69 54 61 62 20 3d 20 70  oot ){..iTab = p
1490: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
14a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
14b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
14c0: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
14d0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
14e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
14f0: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
1500: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
1510: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
1520: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
1530: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
1540: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
1550: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1560: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1570: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1580: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1590: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
15a0: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
15b0: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
15c0: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
15d0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
15e0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
15f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1600: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1610: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1620: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1630: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1640: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1650: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1660: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1670: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
16a0: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
16b0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
16c0: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
16d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
16f0: 73 6f 20 75 73 65 64 20 61 73 20 70 61 72 74 20  so used as part 
1700: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
1710: 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20  ements only. It 
1720: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
1730: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  one or more curs
1750: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1760: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
1770: 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74  oot page iRoot t
1780: 68 61 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e  hat do not belon
1790: 67 20 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e  g to either conn
17a0: 65 63 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a  ection pBtree .*
17b0: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
17c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
17d0: 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63  has the read-unc
17e0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
17f0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  t..**.** For exa
1800: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1810: 74 69 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f  ting to page iRo
1820: 6f 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ot:.**.**    ass
1830: 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
1840: 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20 69  flicts(pBtree, i
1850: 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  Root) );.*/.stat
1860: 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f  ic int hasReadCo
1870: 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70  nflicts(Btree *p
1880: 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f  Btree, Pgno iRoo
1890: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  p;.  for(p=pBtre
18b0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
18e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20  Root==iRoot .   
18f0: 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d    && p->pBtree!=
1900: 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20 30  pBtree.     && 0
1910: 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62  ==(p->pBtree->db
1920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1930: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1940: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1950: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1970: 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69  .#endif    /* #i
1980: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1990: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  G */../*.** Quer
19a0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
19b0: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
19c0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19d0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
19e0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
19f0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
1a00: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1a10: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
1a20: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
1a30: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
1a40: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
1a50: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
1a60: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a70: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
1a80: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
1aa0: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ab0: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
1ac0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
1ad0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
1ae0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1af0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1b00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b10: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b20: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1b30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1b40: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1b50: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1b60: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
1b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 70  );.  assert( !(p
1b80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1b90: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1ba0: 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  ed)||eLock==WRIT
1bb0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
1bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
1bd0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
1be0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
1bf0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
1c00: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
1c10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1c20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
1c30: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
1c40: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
1c50: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
1c60: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
1c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c80: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
1c90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ca0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1cb0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
1cc0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
1cd0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
1ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1cf0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1d00: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d10: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d20: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
1d30: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1d40: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1d50: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1d60: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1d70: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
1d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
1da0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1db0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
1dc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1dd0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
1de0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
1df0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
1e00: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
1e10: 69 74 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e  iter!=p && pBt->
1e20: 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1e30: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1e40: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1e50: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
1e60: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
1e70: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1e80: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
1e90: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1ea0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1eb0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1ec0: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
1ed0: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
1ee0: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
1ef0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f00: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
1f20: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
1f30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1f40: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
1f50: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1f60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f70: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
1f80: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
1f90: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
1fa0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
1fb0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1fc0: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
1fd0: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
1fe0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
1ff0: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2000: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2010: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
2020: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
2030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2040: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
2060: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
2070: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2080: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2090: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
20a0: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
20b0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
20c0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
20d0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
20e0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
20f0: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2100: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2110: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
2120: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
2130: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
2140: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
2150: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2160: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
2170: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2180: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2190: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
21a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21c0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
21d0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
21e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2200: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2210: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2230: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2240: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2250: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2260: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2270: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
2280: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
2290: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
22a0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
22b0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
22c0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
22d0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
22e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2300: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2310: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
2320: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
2330: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79  SQLITE_NOMEM may
2340: 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65   also be returne
2350: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2360: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2370: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
2380: 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20  p, Pgno iTable, 
2390: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
23a0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23b0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
23c0: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f  Lock = 0;.  BtLo
23d0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
23e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23f0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
2410: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2420: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2430: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2440: 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f  p->db!=0 );..  /
2450: 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  * A connection w
2460: 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63  ith the read-unc
2470: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
2480: 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79  t will never try
2490: 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20   to.  ** obtain 
24a0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e  a read-lock usin
24b0: 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
24c0: 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c   The only read-l
24d0: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a  ock obtained.  *
24e0: 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f  * by a connectio
24f0: 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d  n in read-uncomm
2500: 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e  itted mode is on
2510: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2520: 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  er .  ** table, 
2530: 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73  and that lock is
2540: 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72   obtained in Btr
2550: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20  eeBeginTrans(). 
2560: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
2570: 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  =(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d  itted) || eLock=
25a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  =WRITE_LOCK );..
25b0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
25c0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
25d0: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
25e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
25f0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2600: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2610: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
2620: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  sert( SQLITE_OK=
2630: 3d 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68  =querySharedCach
2640: 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
2650: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
2660: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
2670: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
2680: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
2690: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
26a0: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
26b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
26c0: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
26d0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
26e0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
26f0: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
2700: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
2710: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
2720: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2740: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
2750: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
2760: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
2770: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
2780: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
2790: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
27a0: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
27b0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
27c0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
27d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
27e0: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
27f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2800: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
2810: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
2820: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2830: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2840: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
2850: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
2860: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
2870: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
2880: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
2890: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
28a0: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
28b0: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
28c0: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
28d0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
28e0: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
28f0: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
2900: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
2910: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
2920: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
2930: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
2940: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
2950: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
2960: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
2970: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
2980: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
2990: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
29a0: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
29b0: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
29c0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
29d0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
29e0: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
29f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
2a10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2a20: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2a50: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
2a60: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
2a70: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
2a80: 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68  a calls to.** th
2a90: 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  e setSharedCache
2aa0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63  TableLock() proc
2ab0: 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42  edure) held by B
2ac0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a  tree handle p..*
2ad0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ae0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
2af0: 68 61 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20  handle p has an 
2b00: 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69  open read or wri
2b10: 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  te .** transacti
2b20: 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  on. If it does n
2b30: 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53  ot, then the BtS
2b40: 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20  hared.isPending 
2b50: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20  variable.** may 
2b60: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
2b70: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
2b80: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
2b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2ba0: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
2bb0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2bc0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2bd0: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
2be0: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
2bf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2c00: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2c10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2c20: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
2c30: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
2c40: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
2c50: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
2c60: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
2c70: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
2c80: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
2c90: 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69  ( pBt->isExclusi
2ca0: 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ve==0 || pBt->pW
2cb0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
2cc0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
2cd0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
2ce0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
2cf0: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
2d00: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
2d10: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
2d20: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
2d30: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
2d40: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
2d50: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
2d60: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
2d70: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
2d80: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
2d90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
2da0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
2db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2dc0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
2dd0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2de0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
2df0: 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c 7c  >isPending==0 ||
2e00: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
2e10: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
2e20: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
2e30: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
2e40: 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
2e50: 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42  sive = 0;.    pB
2e60: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
2e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
2e80: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
2e90: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
2ea0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2eb0: 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65 63  lled when connec
2ec0: 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c 75  tion p is conclu
2ed0: 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a 2a  ding its .    **
2ee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2ef0: 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79   there currently
2f00: 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65 72   exists a writer
2f10: 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20  , and p is not. 
2f20: 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74 65     ** that write
2f30: 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  r, then the numb
2f40: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  er of locks held
2f50: 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
2f60: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  other.    ** tha
2f70: 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75 73  n the writer mus
2f80: 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64 72  t be about to dr
2f90: 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  op to zero. In t
2fa0: 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  his case.    ** 
2fb0: 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69 6e  set the isPendin
2fc0: 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20  g flag to 0..   
2fd0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2fe0: 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  ere is not curre
2ff0: 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74  ntly a writer, t
3000: 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73 50  hen BtShared.isP
3010: 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20 20  ending must.    
3020: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3030: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3040: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3050: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3060: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3070: 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  isPending = 0;. 
3080: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3090: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
30a0: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
30b0: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
30c0: 74 69 6f 6e 20 70 20 74 6f 20 72 65 61 64 2d 6c  tion p to read-l
30d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
30e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
30f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3100: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3110: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3120: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3130: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3140: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3150: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3160: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3170: 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69    pBt->isExclusi
3180: 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  ve = 0;.    pBt-
3190: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
31a0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
31b0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
31c0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
31d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
31e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
31f0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3200: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3210: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3220: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3230: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3240: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3250: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3260: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3270: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3280: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3290: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
32a0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
32b0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
32c0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d  cursor holds a m
32d0: 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
32e0: 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ared.*/.#ifndef 
32f0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
3300: 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  t cursorHoldsMut
3310: 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ex(BtCursor *p){
3320: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3330: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
3340: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  pBt->mutex);.}.#
3350: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
3360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3370: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  BLOB./*.** Inval
3380: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3390: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
33a0: 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43  he for cursor pC
33b0: 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73  ur, if any..*/.s
33c0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
33d0: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
33e0: 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  he(BtCursor *pCu
33f0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
3400: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
3410: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
3420: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
3430: 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
3440: 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >aOverflow = 0;.
3450: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
3460: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
3470: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
3480: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
3490: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68   opened.** on th
34a0: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
34b0: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
34c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
34d0: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
34e0: 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64  owCache(BtShared
34f0: 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
3500: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
3510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3520: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
3530: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
3540: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
3550: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76  >pNext){.    inv
3560: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3570: 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ache(p);.  }.}..
3580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3590: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
35a0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
35b0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
35c0: 20 74 61 62 6c 65 0a 2a 2a 20 62 2d 74 72 65 65   table.** b-tree
35d0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
35e0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
35f0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3600: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3610: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3620: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3630: 64 2e 20 41 72 67 75 6d 65 6e 74 20 70 67 6e 6f  d. Argument pgno
3640: 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  Root is the .** 
3650: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65  root-page of the
3660: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 0a   table b-tree. .
3670: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3680: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3690: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
36a0: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
36b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
36c0: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
36d0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
36e0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
36f0: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3700: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3710: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3720: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3730: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3740: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3750: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3760: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3770: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3780: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3790: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
37a0: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
37b0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
37c0: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
37d0: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
37e0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
37f0: 20 6f 6e 20 74 68 69 73 20 73 70 65 63 69 66 69   on this specifi
3800: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
3810: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3820: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
3830: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
3840: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3850: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3860: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
3870: 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
3880: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f        /* Look fo
3890: 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  r read cursors o
38a0: 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  n this btree */.
38b0: 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20    i64 iRow,     
38c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
38d0: 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
38e0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
38f0: 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61  .  int isClearTa
3900: 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ble        /* Tr
3910: 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  ue if all rows a
3920: 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  re being deleted
3930: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
3940: 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
3950: 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
3960: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
3970: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3980: 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
3990: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
39a0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
39b0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
39c0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
39d0: 6c 65 20 26 26 20 28 69 73 43 6c 65 61 72 54 61  le && (isClearTa
39e0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
39f0: 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20  Key==iRow) ){.  
3a00: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
3a10: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3a20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
3a30: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  se.  #define inv
3a40: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3a50: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3a60: 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  e invalidateAllO
3a70: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3a80: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3a90: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
3aa0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
3ab0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62  dif../*.** Set b
3ac0: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
3ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3af0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
3b00: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
3b10: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
3b20: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
3b30: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
3b40: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
3b50: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
3b60: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3b70: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
3b80: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
3b90: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
3ba0: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
3bb0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
3bc0: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
3bd0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
3be0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
3bf0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
3c00: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
3c10: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
3c20: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
3c30: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
3c40: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
3c50: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
3c60: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
3c70: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
3c80: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
3c90: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
3ca0: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
3cb0: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
3cc0: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
3cd0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
3ce0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
3cf0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
3d00: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
3d10: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
3d20: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
3d30: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
3d40: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
3d50: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
3d60: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
3d70: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
3d80: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
3d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
3da0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
3db0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
3dc0: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
3dd0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
3de0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
3df0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
3e00: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
3e10: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
3e20: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
3e30: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
3e40: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
3e50: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
3e60: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
3e70: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
3e80: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
3e90: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
3ea0: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
3eb0: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
3ec0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
3ed0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
3ee0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
3ef0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
3f00: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
3f10: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
3f20: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
3f30: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
3f40: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
3f50: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
3f60: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
3f70: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
3f80: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
3f90: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
3fa0: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
3fb0: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
3fc0: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
3fd0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
3fe0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
3ff0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
4000: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
4010: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
4020: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4030: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4040: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4050: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4060: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4070: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4080: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4090: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
40a0: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
40b0: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
40c0: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
40d0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
40e0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
40f0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
4100: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
4110: 6d 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  mmitted if the c
4120: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4130: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4140: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4150: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4160: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4170: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4180: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4190: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
41a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
41b0: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
41c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
41d0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
41e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
41f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4200: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   ){.    int nPag
4220: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
4230: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
4240: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
4250: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4270: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 48 61 73  .      pBt->pHas
4280: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4290: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 28 75  3BitvecCreate((u
42a0: 33 32 29 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  32)nPage);.     
42b0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
42c0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
42d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
42e0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
42f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4310: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
4320: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4330: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4340: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4350: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4360: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4370: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4380: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4390: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
43a0: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
43b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
43c0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
43d0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
43e0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
43f0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4400: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4410: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4420: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4430: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4440: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4450: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4460: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4470: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4480: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
44a0: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
44b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
44c0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
44d0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
44e0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
44f0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4500: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4510: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4520: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4530: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4540: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4550: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4560: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4570: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4580: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4590: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
45a0: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
45b0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
45c0: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
45d0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
45e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
45f0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4600: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4610: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4620: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4630: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4640: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4650: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4660: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4670: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4680: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4690: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
46a0: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
46b0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
46c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
46d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
46e0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
46f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4700: 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
4710: 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
4720: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
4730: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
4740: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
4750: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
4760: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
4770: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
4780: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
4790: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
47a0: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
47b0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
47c0: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
47d0: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
47e0: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
47f0: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
4800: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
4810: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
4820: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
4830: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
4840: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
4850: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
4860: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
4870: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
4880: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
4890: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
48a0: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
48b0: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
48c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
48d0: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
48e0: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
48f0: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
4900: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
4910: 6c 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e  loc( (int)pCur->
4920: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
4930: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
4940: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
4950: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
4960: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
4970: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
4980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4990: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
49a0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
49b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
49c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
49d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
49e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
49f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
4a10: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
4a20: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
4a30: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
4a40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4a50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
4a60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4a70: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4a80: 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
4a90: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4aa0: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43  ge[i]);.      pC
4ab0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4ac0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  0;.    }.    pCu
4ad0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
4ae0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
4af0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
4b00: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
4b10: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
4b20: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
4b30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4b40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
4b50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
4b60: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
4b70: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
4b80: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
4b90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
4ba0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
4bb0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
4bc0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
4bd0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
4be0: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
4bf0: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
4c00: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
4c10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
4c20: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
4c30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4c40: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
4c50: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
4c60: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4c70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4c80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
4c90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
4ca0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
4cb0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
4cc0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
4cd0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
4ce0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
4cf0: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
4d00: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
4d10: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
4d20: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
4d30: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
4d40: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
4d50: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
4d60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
4d70: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
4d80: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
4d90: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4da0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4db0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4dc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
4dd0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
4de0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
4df0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4e00: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
4e10: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4e20: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
4e30: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
4e40: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
4e50: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
4e60: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
4e70: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
4e80: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
4e90: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
4ea0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
4eb0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
4ec0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
4ed0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
4ee0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
4ef0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
4f00: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
4f10: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
4f20: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
4f30: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
4f40: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
4f50: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
4f60: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
4f70: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
4f80: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
4f90: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
4fa0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
4fb0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
4fc0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
4fd0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
4fe0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
4ff0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5000: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5010: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5020: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5030: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5040: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5050: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5060: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5070: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5080: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5090: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
50a0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
50b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
50c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
50d0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
50e0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
50f0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5100: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5110: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5120: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5130: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5140: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5150: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5160: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
5170: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5180: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5190: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
51a0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
51b0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
51c0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
51d0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
51e0: 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
5210: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
5220: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
5230: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
5240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
5260: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5270: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5280: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5290: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
52a0: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
52b0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
52c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
52d0: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
52e0: 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
52f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5300: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
5310: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
5320: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
5330: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
5340: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
5350: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
5360: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
5370: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
5380: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
5390: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
53a0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
53b0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
53c0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
53d0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
53e0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
53f0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
5400: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5410: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
5420: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
5430: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
5440: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
5450: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5460: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5470: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
5480: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5490: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
54a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
54b0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
54c0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
54d0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
54e0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
54f0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
5500: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
5510: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
5520: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
5530: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
5540: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
5550: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
5560: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
5570: 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ip);.  if( rc==S
5580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5590: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55a0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
55b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
55c0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
55d0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
55e0: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
55f0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
5600: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
5610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
5620: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
5630: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
5640: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
5650: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
5660: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  ? \.         sql
5670: 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65  ite3BtreeRestore
5680: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5690: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
56a0: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
56b0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
56c0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
56d0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
56e0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  m the position i
56f0: 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c  t.** was last pl
5700: 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72  aced at.  Cursor
5710: 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20  s can move when 
5720: 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65  the row they are
5730: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20   pointing.** at 
5740: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  is deleted out f
5750: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a  rom under them..
5760: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5770: 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ne returns an er
5780: 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65  ror code if some
5790: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
57a0: 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65  .  The.** intege
57b0: 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20  r *pHasMoved is 
57c0: 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68  set to one if th
57d0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  e cursor has mov
57e0: 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e  ed and 0 if not.
57f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
5800: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
5810: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
5820: 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65  r, int *pHasMove
5830: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  d){.  int rc;.. 
5840: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
5850: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
5860: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
5870: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5880: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
5890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
58b0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
58c0: 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a  skip!=0 ){.    *
58d0: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
58e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61   }else{.    *pHa
58f0: 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  sMoved = 0;.  }.
5900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5910: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
5920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5930: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
5940: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
5950: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
5960: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
5970: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
5980: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
5990: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
59a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
59b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
59c0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
59d0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
59e0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
59f0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5a00: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
5a10: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
5a20: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
5a30: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
5a40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5a50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5a60: 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  ) );.  nPagesPer
5a70: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
5a80: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
5a90: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
5aa0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
5ab0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
5ac0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
5ad0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
5ae0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
5af0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
5b00: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
5b10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
5b20: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
5b30: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
5b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5b60: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
5b70: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
5b80: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
5b90: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
5ba0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
5bb0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
5bc0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
5bd0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20  r 'pgno'..** An 
5be0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
5bf0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
5c00: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
5c10: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
5c20: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
5c30: 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  nt ptrmapPut(BtS
5c40: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5c50: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
5c60: 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20  Pgno parent){.  
5c70: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
5c80: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
5c90: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
5ca0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
5cb0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5cc0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
5cd0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
5ce0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
5cf0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
5d00: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
5d10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5d20: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
5d30: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
5d40: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
5d50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5d60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5d70: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
5d80: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
5d90: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
5da0: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
5db0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
5dc0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
5dd0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
5de0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
5df0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
5e00: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
5e10: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
5e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5e30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5e40: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74  _BKPT;.  }.  iPt
5e50: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
5e60: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
5e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
5e80: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
5e90: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
5ea0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
5eb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5ed0: 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  }.  offset = PTR
5ee0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
5ef0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
5f00: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
5f10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
5f20: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
5f30: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
5f40: 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  t;.  }.  pPtrmap
5f50: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
5f60: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
5f70: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
5f80: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
5f90: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
5fa0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
5fb0: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
5fc0: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
5fd0: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
5fe0: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
5ff0: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
6000: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6010: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6020: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6030: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6040: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6050: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6060: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6070: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6080: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6090: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
60a0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
60b0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
60c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
60d0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
60e0: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
60f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6100: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6110: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
6120: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6130: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
6140: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
6150: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
6160: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
6170: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
6180: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
6190: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
61a0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
61b0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
61c0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
61d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
61e0: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
61f0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6200: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
6210: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
6220: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
6230: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
6240: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6250: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
6260: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6270: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
6280: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
6290: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
62a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
62b0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
62c0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
62d0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
62e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
62f0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6310: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6320: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
6330: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6340: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6350: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6360: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6370: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6380: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
6390: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
63a0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
63b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
63c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
63d0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
63e0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
63f0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6410: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6420: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6430: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6440: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6450: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6460: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6470: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6480: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
6490: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
64a0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
64b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
64c0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
64d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
64e0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
64f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6500: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6510: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6520: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6530: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6540: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6550: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6560: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6570: 74 72 28 78 2c 20 79 29 20 53 51 4c 49 54 45 5f  tr(x, y) SQLITE_
6580: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
6590: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
65a0: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
65b0: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
65c0: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
65d0: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
65e0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
65f0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
6600: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
6610: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
6620: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
6630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6640: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
6650: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
6660: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
6670: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
6680: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49  ine findCell(P,I
6690: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
66a0: 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  a + ((P)->maskPa
66b0: 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28  ge & get2byte(&(
66c0: 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63  P)->aData[(P)->c
66d0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d  ellOffset+2*(I)]
66e0: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )))../*.** This 
66f0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6700: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6710: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6720: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6730: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6740: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
6750: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
6760: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
6770: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
6780: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
6790: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
67a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
67b0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
67c0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
67d0: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
67e0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
67f0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
6800: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f  k;.    struct _O
6810: 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a  vflCell *pOvfl;.
6820: 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61      pOvfl = &pPa
6830: 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20  ge->aOvfl[i];.  
6840: 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78    k = pOvfl->idx
6850: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
6860: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
6870: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
6880: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c      return pOvfl
6890: 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pCell;.      }
68a0: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
68b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
68c0: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
68d0: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
68e0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
68f0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
6900: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
6910: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
6920: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
6930: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
6940: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
6950: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6960: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
6970: 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20   .** cell index 
6980: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6990: 67 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74  gument and sqlit
69a0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
69b0: 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20  Ptr() .** takes 
69c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
69d0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
69e0: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
69f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
6a00: 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  Within this file
6a10: 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28  , the parseCell(
6a20: 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63  ) macro can be c
6a30: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66  alled instead of
6a40: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
6a50: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
6a60: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
6a70: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
6a80: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f  be faster..*/.vo
6a90: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  id sqlite3BtreeP
6aa0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
6ab0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
6ac0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
6ad0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
6ae0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
6af0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
6b00: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
6b10: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
6b20: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
6b30: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
6b40: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
6b50: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ure */.){.  u16 
6b60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
6b70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
6b80: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
6b90: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
6ba0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
6bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6bc0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
6bd0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
6be0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6bf0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6c00: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6c10: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
6c20: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
6c30: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
6c40: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
6c50: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
6c60: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
6c70: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
6c80: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
6c90: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
6ca0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
6cb0: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
6cc0: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
6cd0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
6ce0: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
6cf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6d00: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
6d20: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
6d30: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
6d40: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
6d50: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
6d60: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
6d70: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
6d80: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
6d90: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
6da0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
6db0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
6dc0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
6dd0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
6de0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
6df0: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
6e00: 3d 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  = n;.  if( likel
6e10: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
6e20: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
6e30: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
6e40: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
6e50: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
6e60: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
6e70: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
6e80: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
6e90: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
6ea0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
6eb0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
6ec0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
6ed0: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
6ee0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
6ef0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
6f00: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
6f10: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
6f20: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
6f30: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
6f40: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ow = 0;.    if( 
6f50: 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20  (nSize & ~3)==0 
6f60: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
6f70: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
6f80: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
6f90: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
6fa0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
6fb0: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d   (u16)nSize;.  }
6fc0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
6fd0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
6fe0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
6ff0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
7000: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7010: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7020: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7030: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7040: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7050: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7060: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7070: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7080: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7090: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
70a0: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
70b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
70c0: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
70d0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
70e0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
70f0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
7100: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7110: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7120: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7130: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7140: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7150: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7160: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7170: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7180: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7190: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
71a0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
71b0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
71c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
71d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
71e0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
71f0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
7200: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7210: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7220: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7230: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7240: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7250: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7260: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7270: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7280: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7290: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
72a0: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
72b0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
72c0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
72d0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
72e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
72f0: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
7300: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
7310: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7320: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
7330: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
7340: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7350: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
7360: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
7370: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7380: 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e  = (u16)(pInfo->n
7390: 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20  Local + n);.    
73a0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
73b0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
73c0: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
73d0: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
73e0: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
73f0: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
7400: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
7410: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
7420: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
7430: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
7440: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
7450: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
7460: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
7470: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
7480: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
7490: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
74b0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
74c0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
74d0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
74e0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
74f0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7500: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
7510: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7520: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
7530: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7540: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7550: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
7560: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
7570: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7580: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
7590: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
75a0: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
75b0: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
75c0: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
75d0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
75e0: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
75f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
7600: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
7610: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
7620: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
7630: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
7640: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7650: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
7660: 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c  8 *pIter = &pCel
7670: 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  l[pPage->childPt
7680: 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53  rSize];.  u32 nS
7690: 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ize;..#ifdef SQL
76a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
76b0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
76c0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
76d0: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
76e0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
76f0: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
7700: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
7710: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
7720: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
7730: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
7740: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
7750: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
7760: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
7770: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
7780: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
7790: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
77a0: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
77b0: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
77c0: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
77d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
77e0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
77f0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
7800: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
7810: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7820: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
7830: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
7840: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
7850: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7860: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7870: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
7880: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
7890: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
78a0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
78b0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
78c0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
78d0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
78e0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
78f0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
7900: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
7910: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
7920: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
7930: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
7940: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
7950: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
7960: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
7970: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
7980: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
7990: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
79a0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
79b0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
79c0: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
79d0: 7d 0a 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  }..  if( nSize>p
79e0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
79f0: 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  {.    int minLoc
7a00: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
7a10: 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20  ocal;.    nSize 
7a20: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53  = minLocal + (nS
7a30: 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20  ize - minLocal) 
7a40: 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
7a50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7a60: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
7a70: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7a80: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
7a90: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7aa0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
7ab0: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
7ac0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
7ad0: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
7ae0: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
7af0: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
7b00: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
7b10: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
7b20: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
7b30: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
7b40: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
7b50: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
7b60: 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ze;.}.#ifndef ND
7b70: 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20  EBUG.static u16 
7b80: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
7b90: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7ba0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
7bb0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7bc0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
7bd0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
7be0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
7bf0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7c00: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
7c10: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
7c20: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
7c30: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
7c40: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
7c50: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
7c60: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7c70: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
7c80: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
7c90: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
7ca0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
7cb0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
7cc0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
7cd0: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
7ce0: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nfo;.  assert( p
7cf0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c  Cell!=0 );.  sql
7d00: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
7d10: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7d20: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
7d30: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
7d40: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
7d50: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
7d60: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
7d70: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
7d80: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
7d90: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
7da0: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
7db0: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72  verflow]);.    r
7dc0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
7dd0: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
7de0: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
7df0: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
7e00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7e10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
7e20: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
7e30: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
7e40: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
7e50: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
7e60: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
7e70: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
7e80: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
7e90: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
7ea0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
7eb0: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
7ec0: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
7ed0: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
7ee0: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
7ef0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
7f00: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
7f10: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
7f20: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
7f30: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
7f60: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f80: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
7f90: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
7fa0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
7fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
7fc0: 65 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65  et of first byte
7fd0: 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e   after cell poin
7fe0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
7ff0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8010: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
8030: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
8040: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8050: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
8060: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
8070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8080: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
8090: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
80a0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
80b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
80c0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
80d0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
80e0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8110: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8120: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
8130: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8140: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8150: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
8160: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
8170: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
8180: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
8190: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
81a0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
81b0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
81c0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
81d0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
81e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
81f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8200: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8210: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
8220: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8230: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8240: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
8250: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
8260: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8270: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
8280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8290: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
82a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
82b0: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
82c0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
82d0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
82e0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
82f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8300: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
8310: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
8320: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
8330: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
8340: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
8350: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
8360: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
8370: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
8380: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
8390: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
83a0: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
83b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
83c0: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
83d0: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
83e0: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
83f0: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
8400: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
8410: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
8420: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8430: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8440: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8450: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8460: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8470: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8480: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8490: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
84a0: 69 66 28 20 70 63 3e 3d 75 73 61 62 6c 65 53 69  if( pc>=usableSi
84b0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
84c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
84d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
84e0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
84f0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8500: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8510: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
8520: 28 20 63 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65  ( cbrk<cellOffse
8530: 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b  t+2*nCell || pc+
8540: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8550: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8560: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8570: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
8580: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8590: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
85a0: 63 62 72 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d  cbrk>=0 );.    m
85b0: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
85c0: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
85d0: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
85e0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
85f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
8600: 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32  rk>=cellOffset+2
8610: 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32  *nCell );.  put2
8620: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8630: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
8640: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
8650: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
8660: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
8670: 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c  0;.  addr = cell
8680: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a  Offset+2*nCell;.
8690: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61    memset(&data[a
86a0: 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64  ddr], 0, cbrk-ad
86b0: 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dr);.  assert( s
86c0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
86d0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
86e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
86f0: 63 62 72 6b 2d 61 64 64 72 21 3d 70 50 61 67 65  cbrk-addr!=pPage
8700: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
8710: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8720: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
8730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8740: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
8750: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
8760: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
8770: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
8780: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
8790: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
87a0: 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ument. Return th
87b0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
87c0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
87d0: 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 62 79 74  he .** first byt
87e0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
87f0: 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pace. .**.** The
8800: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
8810: 65 73 20 74 68 61 74 20 74 68 65 20 73 70 61 63  es that the spac
8820: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
8830: 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 6f 66  d of the cell-of
8840: 66 73 65 74 20 0a 2a 2a 20 61 72 72 61 79 20 61  fset .** array a
8850: 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  nd the start of 
8860: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
8870: 20 61 72 65 61 20 69 73 20 61 74 20 6c 65 61 73   area is at leas
8880: 74 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  t nByte bytes.**
8890: 20 69 6e 20 73 69 7a 65 2e 20 53 6f 20 74 68 69   in size. So thi
88a0: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6e 65  s routine can ne
88b0: 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20  ver fail..**.** 
88c0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  If there are alr
88d0: 65 61 64 79 20 36 30 20 6f 72 20 6d 6f 72 65 20  eady 60 or more 
88e0: 62 79 74 65 73 20 6f 66 20 66 72 61 67 6d 65 6e  bytes of fragmen
88f0: 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ts within the pa
8900: 67 65 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  ge,.** the page 
8910: 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  is defragmented 
8920: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
8930: 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e  . If this were n
8940: 6f 74 20 64 6f 6e 65 20 74 68 65 72 65 0a 2a 2a  ot done there.**
8950: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
8960: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
8970: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
8980: 20 63 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c   could eventuall
8990: 79 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 74  y .** overflow t
89a0: 68 65 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66  he single-byte f
89b0: 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65  ield of the page
89c0: 2d 68 65 61 64 65 72 20 69 6e 20 77 68 69 63 68  -header in which
89d0: 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
89e0: 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61  s stored..*/.sta
89f0: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
8a00: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
8a10: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29  Page, int nByte)
8a20: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
8a30: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8a40: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
8a50: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
8a60: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
8a70: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
8a80: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8a90: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
8aa0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
8ab0: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Data */.  int nF
8ac0: 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  rag;            
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ae0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67  * Number of frag
8af0: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20  mented bytes on 
8b00: 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74  pPage */.  int t
8b10: 6f 70 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  op;.  .  assert(
8b20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
8b30: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
8b40: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
8b50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8b60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8b70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8b80: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8b90: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8ba0: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
8bb0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
8bc0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
8bd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
8be0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
8bf0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
8c00: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
8c10: 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
8c20: 68 65 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  he space between
8c30: 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74   the cell-offset
8c40: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 0a   array and the .
8c50: 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e    ** cell-conten
8c60: 74 20 61 72 65 61 20 69 73 20 67 72 65 61 74 65  t area is greate
8c70: 72 20 74 68 61 6e 20 6e 42 79 74 65 20 62 79 74  r than nByte byt
8c80: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
8c90: 74 28 20 6e 42 79 74 65 20 3c 3d 20 28 0a 20 20  t( nByte <= (.  
8ca0: 20 20 20 20 67 65 74 32 62 79 74 65 28 26 64 61      get2byte(&da
8cb0: 74 61 5b 68 64 72 2b 35 5d 29 2d 28 68 64 72 2b  ta[hdr+5])-(hdr+
8cc0: 38 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  8+(pPage->leaf?0
8cd0: 3a 34 29 2b 32 2a 67 65 74 32 62 79 74 65 28 26  :4)+2*get2byte(&
8ce0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 29 0a 20 20  data[hdr+3])).  
8cf0: 29 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64  ));..  nFrag = d
8d00: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
8d10: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
8d20: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
8d30: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
8d40: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
8d50: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
8d60: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
8d70: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
8d80: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
8d90: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
8da0: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
8db0: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
8dc0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
8dd0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
8de0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
8df0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
8e00: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
8e10: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
8e20: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
8e30: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
8e40: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
8e50: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
8e60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
8e70: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
8e80: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
8e90: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
8ea0: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
8eb0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
8ec0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
8ed0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
8ee0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
8ef0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
8f00: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
8f10: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
8f20: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
8f30: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
8f40: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
8f50: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
8f60: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
8f70: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
8f80: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
8f90: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
8fa0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
8fb0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
8fc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8fd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
8fe0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
8ff0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9000: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9010: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9020: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9030: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9040: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9050: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9060: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9070: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9080: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
9090: 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  n pc + x;.      
90a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
90b0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
90c0: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
90d0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
90e0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
90f0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
9100: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
9110: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  .  */.  top = ge
9120: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9130: 2b 35 5d 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20  +5]) - nByte;.  
9140: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9150: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
9160: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
9170: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
9180: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
9190: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
91a0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
91b0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
91c0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
91d0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
91e0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
91f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9200: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
9210: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
9220: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
9230: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
9240: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
9250: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
9260: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
9270: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
9280: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
9290: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
92a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
92b0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
92c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
92d0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
92e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
92f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9300: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
9310: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
9320: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9330: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
9340: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9350: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
9360: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
9370: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
9380: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
9390: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
93a0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
93b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
93c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
93d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
93e0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
93f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
9400: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
9410: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9420: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
9430: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
9440: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
9450: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
9460: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
9470: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
9480: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
9490: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
94a0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
94b0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
94c0: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
94d0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
94e0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
94f0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
9500: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
9510: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
9520: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
9530: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
9540: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
9550: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
9560: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
9570: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
9580: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
9590: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
95a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
95b0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  4 );.    if( pbe
95c0: 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20  gin<=addr ) {.  
95d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
95e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
95f0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
9600: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
9610: 66 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65  f ( pbegin>pPage
9620: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9630: 65 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75  e-4 ) {.    retu
9640: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9650: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
9660: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
9670: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
9680: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
9690: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
96a0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
96b0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
96c0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
96d0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
96e0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
96f0: 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46  Free = pPage->nF
9700: 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b  ree + (u16)size;
9710: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
9720: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
9730: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
9740: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9750: 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  t + 1;.  while( 
9760: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
9770: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
9780: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
9790: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
97a0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
97b0: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
97c0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
97d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
97e0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
97f0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
9800: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
9810: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
9820: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
9830: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
9840: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
9850: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
9860: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
9870: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
9880: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
9890: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
98a0: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
98b0: 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  t)data[pPage->hd
98c0: 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20  rOffset+7]) ){. 
98d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
98e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
98f0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
9900: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
9910: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38  Offset+7] -= (u8
9920: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
9930: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9940: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
9950: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
9960: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
9970: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
9980: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
9990: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
99a0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
99b0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
99c0: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
99d0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
99e0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
99f0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
9a00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
9a10: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
9a20: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
9a30: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
9a40: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
9a50: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
9a60: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
9a70: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
9a80: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
9a90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
9aa0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
9ab0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
9ac0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
9ad0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9ae0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9af0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
9b00: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
9b10: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
9b20: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
9b30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
9b40: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
9b50: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
9b60: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
9b70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9b80: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
9b90: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
9ba0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
9bb0: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
9bc0: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
9bd0: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
9be0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
9bf0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
9c00: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
9c10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
9c20: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
9c30: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
9c40: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
9c50: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
9c60: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
9c70: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
9c80: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
9c90: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
9ca0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
9cb0: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
9cc0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
9cd0: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
9ce0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
9cf0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
9d00: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
9d10: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
9d20: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9d30: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
9d40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
9d50: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9d60: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
9d70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d80: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
9d90: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
9da0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
9db0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9dc0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9dd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9de0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
9df0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
9e00: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
9e10: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
9e20: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
9e30: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
9e40: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
9e50: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
9e60: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
9e70: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
9e80: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
9e90: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
9ea0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
9eb0: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
9ec0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
9ed0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
9ee0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9ef0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
9f00: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
9f10: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
9f20: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
9f30: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
9f40: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
9f50: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
9f60: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
9f70: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
9f80: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
9f90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
9fa0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
9fb0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
9fc0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
9fd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9fe0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9ff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a000: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
a010: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
a020: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
a030: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
a040: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
a050: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
a060: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
a070: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
a080: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
a090: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
a0a0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
a0b0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
a0c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
a0d0: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
a0e0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
a0f0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
a100: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
a110: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
a120: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
a130: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
a140: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
a150: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
a160: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
a170: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
a180: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
a190: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a1a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
a1b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a1c0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a1d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a1e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
a1f0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
a200: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
a210: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a220: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
a230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
a240: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
a250: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
a260: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
a270: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
a280: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
a290: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
a2a0: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
a2b0: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
a2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
a2d0: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
a2e0: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
a2f0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
a300: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
a310: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
a320: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
a330: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
a340: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
a350: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
a360: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
a370: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
a380: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
a390: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
a3a0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36  cture */.    u16
a3b0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
a3c0: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
a3d0: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
a3e0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
a3f0: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
a400: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
a410: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
a420: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
a430: 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e  ter */.    u16 n
a440: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
a450: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
a460: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
a470: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74  age */.    u16 t
a480: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
a490: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
a4a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
a4b0: 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74  area */..    pBt
a4c0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
a4d0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
a4e0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
a4f0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
a500: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
a510: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
a520: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
a530: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a540: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
a550: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
a560: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
a570: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
a580: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
a590: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
a5a0: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20  geSize - 1;.    
a5b0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
a5c0: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
a5d0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
a5e0: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
a5f0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
a600: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
a610: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
a620: 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d  >leaf;.    top =
a630: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a640: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
a650: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
a660: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
a670: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
a680: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
a690: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
a6a0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
a6b0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
a6c0: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
a6d0: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
a6e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a6f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a700: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a710: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
a720: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
a730: 63 61 75 73 65 20 75 73 65 20 74 6f 20 72 65 61  cause use to rea
a740: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
a750: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
a760: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
a770: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
a780: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a790: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
a7a0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
a7b0: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
a7c0: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
a7d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
a7e0: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
a7f0: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
a800: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
a810: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
a820: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
a830: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
a840: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
a850: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
a860: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
a870: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 2f 2a 20  CellFirst;   /* 
a880: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
a890: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
a8a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
a8b0: 74 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  t;    /* Last po
a8c0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
a8d0: 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
a8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a8f0: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a910: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
a920: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
a930: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
a940: 2f 0a 0a 20 20 20 20 20 20 69 43 65 6c 6c 46 69  /..      iCellFi
a950: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
a960: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
a970: 6c 3b 0a 20 20 20 20 20 20 69 43 65 6c 6c 4c 61  l;.      iCellLa
a980: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
a990: 2d 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 21  - 4;.      if( !
a9a0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
a9b0: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
a9c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
a9d0: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
a9e0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
a9f0: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
aa00: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
aa10: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
aa20: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
aa30: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
aa40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aa50: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
aa60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa70: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
aa80: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
aa90: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [pc]);.        i
aaa0: 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
aab0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
aac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
aad0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
aae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
aaf0: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
ab00: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
ab10: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
ab20: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
ab30: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
ab40: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
ab50: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
ab60: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
ab70: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
ab80: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
ab90: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
aba0: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
abb0: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ze-4 ){.        
abc0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
abd0: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
abe0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
abf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ac00: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
ac10: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
ac20: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
ac30: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
ac40: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
ac50: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ]);.      if( ne
ac60: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
ac70: 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20  +size+3 ){.     
ac80: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
ac90: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
aca0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
acb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
acc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
acd0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
ace0: 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
acf0: 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70   + size;.      p
ad00: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
ad10: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
ad20: 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
ad30: 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
ad40: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
ad50: 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  he start.    ** 
ad60: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
ad70: 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
ad80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
ad90: 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
ada0: 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
adb0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
adc0: 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
add0: 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
ade0: 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ize.    ** of th
adf0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
ae00: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
ae10: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
ae20: 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  eck also.    ** 
ae30: 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
ae40: 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
ae50: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
ae60: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
ae70: 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61  t.    ** area, a
ae80: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
ae90: 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
aea0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
aeb0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
aec0: 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
aed0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
aee0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
aef0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
af00: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
af10: 3d 20 6e 46 72 65 65 20 2d 20 28 63 65 6c 6c 4f  = nFree - (cellO
af20: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
af30: 3e 6e 43 65 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a  >nCell);..#if 0.
af40: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
af50: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
af60: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
af70: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
af80: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
af90: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
afa0: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
afb0: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
afc0: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
afd0: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
afe0: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
aff0: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
b000: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
b010: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
b020: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
b030: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
b040: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
b050: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
b060: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
b070: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
b080: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
b090: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
b0a0: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
b0b0: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
b0c0: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
b0d0: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
b0e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
b0f0: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
b100: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
b110: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
b120: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
b130: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
b140: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
b150: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
b160: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
b170: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
b180: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
b190: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
b1a0: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
b1b0: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
b1c0: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
b1d0: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
b1e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b1f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b200: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
b210: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
b220: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
b230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
b250: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
b260: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
b270: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
b280: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
b290: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
b2a0: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
b2b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b2c0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
b2d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
b2e0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b2f0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
b300: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
b310: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
b320: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b330: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
b340: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b350: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b360: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
b370: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
b380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
b390: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
b3a0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
b3b0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
b3c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b3d0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
b3e0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
b3f0: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
b400: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b410: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b420: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b430: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b440: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
b450: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d  utex) );.  /*mem
b460: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
b470: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
b480: 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64  ze - hdr);*/.  d
b490: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
b4a0: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
b4b0: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
b4c0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
b4d0: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
b4e0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
b4f0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
b500: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
b510: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b520: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
b530: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
b540: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
b550: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
b560: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
b570: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
b580: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
b590: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
b5a0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
b5b0: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
b5c0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
b5d0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
b5e0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
b5f0: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
b600: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
b610: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
b620: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
b630: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
b640: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
b650: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
b660: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
b670: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
b680: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
b690: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
b6a0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
b6b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
b6c0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
b6d0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
b6e0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
b6f0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
b700: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
b710: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
b720: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
b730: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
b740: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
b750: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
b760: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
b770: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
b780: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
b790: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
b7a0: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
b7b0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
b7c0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
b7d0: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
b7e0: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
b7f0: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
b800: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
b810: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
b820: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
b830: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
b840: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
b850: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
b860: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
b870: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
b880: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
b890: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
b8a0: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
b8b0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
b8c0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
b8d0: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
b8e0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
b8f0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
b900: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
b910: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
b920: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
b930: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
b940: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
b950: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
b960: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
b970: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
b980: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
b990: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
b9a0: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
b9b0: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
b9c0: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
b9d0: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
b9e0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
b9f0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
ba00: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
ba10: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
ba20: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
ba30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ba40: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
ba50: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
ba60: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
ba70: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
ba80: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
ba90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
baa0: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
bab0: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
bac0: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
bad0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
bae0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
baf0: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
bb00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
bb10: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
bb20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
bb30: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
bb40: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
bb50: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
bb60: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
bb70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
bb80: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
bb90: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
bba0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
bbb0: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
bbc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bbd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
bbe0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
bbf0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
bc00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
bc10: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
bc20: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
bc30: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
bc40: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
bc50: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
bc60: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
bc70: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
bc80: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
bc90: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
bca0: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
bcb0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
bcc0: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
bcd0: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
bce0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bcf0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
bd00: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
bd10: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
bd20: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
bd30: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
bd40: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
bd50: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
bd60: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
bd70: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
bd80: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
bd90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
bda0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
bdb0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
bdc0: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
bdd0: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
bde0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
bdf0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
be00: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
be10: 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o pagerPagecount
be20: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
be30: 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d  .  int nPage = -
be40: 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
be50: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
be60: 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  e1 );.  rc = sql
be70: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
be80: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
be90: 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  &nPage);.  asser
bea0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
beb0: 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b   || nPage==-1 );
bec0: 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29  .  return (Pgno)
bed0: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
bee0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
bef0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
bf00: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
bf10: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
bf20: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
bf30: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
bf40: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
bf50: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
bf60: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
bf70: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
bf80: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
bf90: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
bfa0: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
bfb0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
bfc0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
bfd0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
bfe0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
bff0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
c000: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
c010: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
c020: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
c030: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
c040: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
c050: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
c060: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
c070: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c080: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c090: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
c0a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c0b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c0c0: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f  _BKPT; .  }..  /
c0d0: 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68  * It is often th
c0e0: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
c0f0: 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20  page we want is 
c100: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
c110: 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65  ..  ** If so, ge
c120: 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20  t it directly.  
c130: 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72  This saves us fr
c140: 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c  om having to cal
c150: 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65  l.  ** pagerPage
c160: 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20  count() to make 
c170: 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74  sure pgno is wit
c180: 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63  hin limits, whic
c190: 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  h results.  ** i
c1a0: 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  n a measureable 
c1b0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
c1c0: 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  ovements..  */. 
c1d0: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
c1e0: 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
c1f0: 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20  up(pBt, pgno);. 
c200: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
c210: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
c220: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
c230: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c240: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
c250: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
c260: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
c270: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
c280: 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
c290: 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
c2a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c2b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
c2c0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
c2d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
c2e0: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
c2f0: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
c300: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c310: 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70  .    pPage = *pp
c320: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
c330: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
c340: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c350: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
c360: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pPage);.  }.  if
c370: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c380: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
c390: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a  ge(pPage);.    *
c3a0: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
c3b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c3c0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
c3d0: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
c3e0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
c3f0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
c400: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
c410: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
c420: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
c430: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
c440: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
c450: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
c460: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
c470: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
c480: 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
c490: 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  geRefcount(pPage
c4a0: 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a  ->pDbPage)>1 );.
c4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c4c0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
c4d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c4e0: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
c4f0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
c500: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
c510: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
c520: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
c530: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c540: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
c550: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
c560: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
c570: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c580: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
c590: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
c5a0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c5b0: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
c5c0: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
c5d0: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
c5e0: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
c5f0: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
c600: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
c610: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
c620: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
c630: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
c640: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
c650: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
c660: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
c670: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
c680: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
c690: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c6a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
c6b0: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
c6c0: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
c6d0: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
c6e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
c6f0: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
c700: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
c710: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
c720: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
c730: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
c740: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
c750: 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
c760: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
c770: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
c780: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
c790: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
c7a0: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
c7b0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
c7c0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
c7d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c7e0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
c7f0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
c800: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
c810: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
c820: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
c830: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
c840: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
c850: 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
c860: 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
c870: 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
c880: 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
c890: 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
c8a0: 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
c8b0: 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
c8c0: 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
c8d0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
c8e0: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
c8f0: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
c900: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
c910: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
c920: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
c930: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
c940: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
c950: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
c960: 61 74 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  at.      ** sqli
c970: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
c980: 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
c990: 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
c9a0: 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
c9b0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
c9c0: 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
c9d0: 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
c9e0: 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
c9f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ca00: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
ca10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ca20: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
ca30: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
ca40: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
ca50: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
ca60: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
ca70: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
ca80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
ca90: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
caa0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
cab0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cac0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cad0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
cae0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
caf0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
cb00: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
cb10: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
cb20: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
cb30: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
cb40: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
cb50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
cb60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
cb70: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
cb80: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
cb90: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
cba0: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
cbb0: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
cbc0: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
cbd0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
cbe0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
cbf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
cc00: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
cc10: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
cc20: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
cc30: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
cc40: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
cc50: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
cc60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
cc70: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
cc80: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
cc90: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
cca0: 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
ccb0: 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
ccc0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ccd0: 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
cce0: 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
ccf0: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
cd00: 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
cd10: 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
cd20: 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
cd30: 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
cd40: 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
cd50: 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
cd60: 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
cd70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
cd80: 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
cd90: 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
cda0: 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
cdb0: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
cdc0: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
cdd0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
cde0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
cdf0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
ce00: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
ce10: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
ce20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
ce30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
ce40: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
ce50: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
ce60: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
ce70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
ce80: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
ce90: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
cea0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
ceb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
cec0: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
ced0: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
cee0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
cef0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
cf00: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
cf10: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71  pen() */.){.  sq
cf20: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf40: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
cf50: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
cf60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
cf70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cf80: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
cf90: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
cfa0: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
cfb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
cfc0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
cfd0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
cfe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
cff0: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
d000: 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
d010: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
d020: 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
d030: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d040: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
d050: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
d060: 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
d070: 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
d080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d090: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
d0a0: 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
d0b0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
d0c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
d0d0: 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
d0e0: 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
d0f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
d100: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
d110: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
d120: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
d130: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
d140: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
d150: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
d160: 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d  tabase. This sym
d170: 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  bol is only requ
d180: 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74  ired if.  ** eit
d190: 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65  her of the share
d1a0: 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61  d-data or autova
d1b0: 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72  cuum features ar
d1c0: 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a  e compiled .  **
d1d0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72   into the librar
d1e0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  y..  */.#if !def
d1f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d200: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c  _SHARED_CACHE) |
d210: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
d220: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
d230: 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  M).  #ifdef SQLI
d240: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
d250: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
d260: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65  sMemdb = 0;.  #e
d270: 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
d280: 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c  t isMemdb = zFil
d290: 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70  ename && !strcmp
d2a0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
d2b0: 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69  mory:");.  #endi
d2c0: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  f.#endif..  asse
d2d0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
d2e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d2f0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
d300: 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20  tex) );..  pVfs 
d310: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20  = db->pVfs;.  p 
d320: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
d330: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
d340: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
d350: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d360: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
d370: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
d380: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
d390: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
d3a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d3b0: 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
d3c0: 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
d3d0: 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
d3e0: 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
d3f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d400: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
d410: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
d420: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
d430: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
d440: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
d450: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
d460: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
d470: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
d480: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
d490: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
d4a0: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
d4b0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64   */.  if( isMemd
d4c0: 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d  b==0 && zFilenam
d4d0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
d4e0: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ] ){.    if( sql
d4f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
d500: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
d510: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
d520: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
d530: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
d540: 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
d550: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
d560: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
d570: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d580: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
d590: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
d5a0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
d5b0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62  le = 1;.      db
d5c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
d5d0: 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20  E_SharedCache;. 
d5e0: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
d5f0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
d600: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d610: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
d620: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d640: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
d650: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
d660: 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e  name, nFullPathn
d670: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
d680: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  me);.      mutex
d690: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
d6a0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
d6b0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
d6c0: 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
d6d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
d6e0: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
d6f0: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
d700: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
d710: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
d720: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
d730: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
d740: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
d750: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
d760: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
d770: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d780: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
d790: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
d7a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
d7b0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
d7c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
d7d0: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
d7e0: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
d7f0: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
d800: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
d810: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
d820: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
d830: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
d840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
d850: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
d860: 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
d870: 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
d880: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
d890: 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
d8a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
d8b0: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
d8c0: 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
d8d0: 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
d8e0: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
d8f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
d900: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
d910: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
d920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
d930: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
d940: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
d950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
d960: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
d970: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d980: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
d990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
d9a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
d9b0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
d9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d9d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d9e0: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
d9f0: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
da00: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
da10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
da20: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
da30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
da40: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
da50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
da60: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
da70: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
da80: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
da90: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
daa0: 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
dab0: 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
dac0: 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
dad0: 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
dae0: 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
daf0: 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
db00: 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
db10: 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
db20: 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
db30: 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
db40: 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
db50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
db60: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
db70: 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
db80: 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
db90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
dba0: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
dbb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
dbc0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
dbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
dbe0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
dbf0: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
dc00: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
dc10: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
dc20: 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
dc30: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
dc40: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
dc50: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
dc60: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
dc70: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
dc80: 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
dc90: 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
dca0: 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
dcb0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
dcc0: 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(i64)==8 || siz
dcd0: 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(i64)==4 );. 
dce0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
dcf0: 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(u64)==8 || siz
dd00: 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(u64)==4 );. 
dd10: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
dd20: 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
dd30: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dd40: 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
dd50: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
dd60: 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
dd70: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
dd80: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
dd90: 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
dda0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
ddb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
ddc0: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
ddd0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
dde0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
ddf0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
de00: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
de10: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
de40: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
de50: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
de60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
de70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
de80: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
de90: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
dea0: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
deb0: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
dec0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
ded0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dee0: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
def0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
df00: 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
df10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
df20: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
df30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
df40: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
df50: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
df60: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
df70: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
df80: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
df90: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
dfa0: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
dfb0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
dfc0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
dfd0: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
dfe0: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
dff0: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
e000: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
e010: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
e020: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
e030: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
e040: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
e050: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
e060: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
e070: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
e080: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
e090: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
e0a0: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
e0b0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
e0c0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
e0d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e0e0: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
e0f0: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
e100: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
e110: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
e120: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
e130: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
e140: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
e150: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
e160: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
e170: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
e180: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
e190: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
e1a0: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
e1b0: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
e1c0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
e1d0: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
e1e0: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
e1f0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
e200: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
e210: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
e220: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
e230: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
e240: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
e250: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
e260: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
e270: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
e280: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
e290: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
e2a0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
e2b0: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
e2c0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
e2d0: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
e2e0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
e2f0: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
e300: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
e310: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
e320: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
e330: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
e340: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
e350: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
e360: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
e370: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e380: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
e390: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
e3a0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
e3b0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
e3c0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
e3d0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e3e0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
e3f0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
e400: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
e410: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
e420: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
e430: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
e440: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
e450: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
e460: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
e470: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
e480: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
e490: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
e4a0: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
e4b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
e4c0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
e4d0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
e4e0: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
e4f0: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
e500: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e510: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e520: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
e530: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
e540: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
e550: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
e560: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
e570: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
e580: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
e590: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
e5a0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e5c0: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
e5d0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
e5e0: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
e5f0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
e600: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e610: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
e620: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66  ASTER);.      if
e630: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
e640: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
e650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
e660: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
e670: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
e680: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e690: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
e6a0: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
e6b0: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e6d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e6e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
e6f0: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
e700: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
e710: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
e720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e730: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e740: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
e750: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
e760: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
e770: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
e780: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
e790: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
e7a0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
e7b0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
e7c0: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
e7d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e7e0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
e7f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e800: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
e810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e820: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e830: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e840: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
e850: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
e860: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
e870: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
e880: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
e890: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
e8a0: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
e8b0: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
e8c0: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
e8d0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
e8e0: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
e8f0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
e900: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
e910: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
e920: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
e930: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
e940: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
e950: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
e960: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
e970: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
e980: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
e990: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
e9a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
e9b0: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
e9c0: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
e9d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
e9e0: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
e9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
ea00: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
ea10: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
ea20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
ea30: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
ea40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ea50: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
ea60: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
ea70: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
ea80: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
ea90: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
eaa0: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
eab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
eac0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
ead0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
eae0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
eaf0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
eb00: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
eb10: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
eb20: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
eb30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb40: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
eb50: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
eb60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
eb70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
eb80: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
eb90: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
eba0: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
ebb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ebc0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
ebd0: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
ebe0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
ebf0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
ec00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ec10: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
ec20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ec30: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
ec40: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
ec50: 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
ec60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ec70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
ec80: 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
ec90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
eca0: 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
ecb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ecc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
ecd0: 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
ece0: 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
ecf0: 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
ed00: 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
ed10: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
ed20: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
ed30: 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
ed40: 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
ed50: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
ed60: 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
ed70: 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
ed80: 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
ed90: 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
eda0: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
edb0: 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
edc0: 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
edd0: 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
ede0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
edf0: 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74  ED_CACHE.  sqlit
ee00: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
ee10: 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  r;.  BtShared *p
ee20: 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
ee30: 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
ee40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ee50: 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
ee60: 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74  utex) );.  pMast
ee70: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
ee80: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
ee90: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
eea0: 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  R);.  sqlite3_mu
eeb0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
eec0: 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
eed0: 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
eee0: 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
eef0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
ef00: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
ef10: 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
ef20: 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
ef30: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ef40: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ef50: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
ef60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef70: 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
ef80: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ef90: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
efa0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
efb0: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
efc0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
efd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
efe0: 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
eff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f000: 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
f010: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
f020: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
f030: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
f040: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
f050: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
f060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f070: 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
f080: 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
f090: 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
f0a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f0b0: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
f0c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
f0d0: 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
f0e0: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
f0f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
f100: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
f110: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
f120: 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
f130: 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
f140: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
f150: 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
f160: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
f170: 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
f180: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
f190: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
f1a0: 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
f1b0: 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
f1c0: 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d  ageSize );.  }.}
f1d0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
f1e0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
f1f0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
f200: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
f210: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
f220: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
f230: 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e  3PageFree( pBt->
f240: 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42  pTmpSpace);.  pB
f250: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
f260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f270: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
f280: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
f290: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
f2a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f2b0: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
f2c0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f2d0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
f2e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
f2f0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
f300: 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
f310: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
f320: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
f330: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f340: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
f350: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
f360: 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
f370: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
f380: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
f390: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
f3a0: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
f3b0: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
f3c0: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
f3d0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
f3e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f3f0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
f400: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
f410: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
f420: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
f430: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
f440: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
f450: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
f460: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
f470: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
f480: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
f490: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
f4a0: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
f4b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
f4c0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
f4d0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f4e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
f4f0: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
f500: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
f510: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
f520: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
f530: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
f540: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
f550: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
f560: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
f570: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
f580: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
f590: 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
f5a0: 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
f5b0: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
f5c0: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
f5d0: 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
f5e0: 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
f5f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
f600: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
f610: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
f620: 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
f630: 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
f640: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
f650: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
f660: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
f670: 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
f680: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
f690: 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
f6a0: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
f6b0: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
f6c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
f6d0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f6e0: 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
f6f0: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
f700: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
f710: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
f720: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
f730: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f740: 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63  e3_free(pBt->pSc
f750: 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
f760: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
f770: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f780: 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
f790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f7a0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
f7b0: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
f7c0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
f7d0: 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
f7e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
f7f0: 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
f800: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
f810: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
f820: 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
f830: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
f840: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
f850: 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
f860: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f870: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
f880: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
f890: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
f8a0: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
f8b0: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
f8c0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
f8d0: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
f8e0: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
f8f0: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
f900: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
f910: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
f920: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
f930: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
f940: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
f950: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
f960: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
f970: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
f980: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
f990: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
f9a0: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
f9b0: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
f9c0: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
f9d0: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
f9e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
f9f0: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
fa00: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
fa10: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
fa20: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
fa30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
fa40: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
fa50: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
fa60: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
fa70: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
fa80: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
fa90: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
faa0: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
fab0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
fac0: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
fad0: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
fae0: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
faf0: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
fb00: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
fb10: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
fb20: 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
fb30: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
fb40: 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
fb50: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
fb60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fb70: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
fb80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fb90: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
fba0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
fbb0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
fbc0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
fbd0: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
fbe0: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
fbf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
fc00: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
fc10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fc20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
fc30: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
fc40: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
fc50: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
fc60: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
fc70: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
fc80: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
fc90: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
fca0: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
fcb0: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
fcc0: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
fcd0: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
fce0: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
fcf0: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
fd00: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
fd10: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
fd20: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
fd30: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
fd40: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
fd50: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
fd60: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
fd70: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
fd80: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
fd90: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
fda0: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
fdb0: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
fdc0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
fdd0: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
fde0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fdf0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
fe00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
fe10: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
fe20: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
fe30: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
fe40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
fe50: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
fe60: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
fe70: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
fe80: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
fe90: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
fea0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
feb0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
fec0: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
fed0: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  , fullSync);.  s
fee0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
fef0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
ff00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
ff10: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
ff20: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
ff30: 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
ff40: 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
ff50: 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
ff60: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
ff70: 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
ff80: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
ff90: 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
ffa0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
ffb0: 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
ffc0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
ffd0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
ffe0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
fff0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10000 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
10010 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
10020 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10030 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
10040 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
10050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10060 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
10070 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
10080 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
100a0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
100b0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
100c0 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
100d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
100e0 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
100f0 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
10100 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
10110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10120 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
10130 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
10140 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
10150 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10160 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
10170 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
10180 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
10190 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
101a0 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
101b0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
101c0 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
101d0 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
101e0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
101f0 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
10200 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
10210 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
10220 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
10230 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
10240 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
10250 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
10260 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
10270 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
10280 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
10290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
102a0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
102b0 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
102c0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
102d0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
102e0 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
102f0 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
10300 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
10310 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
10320 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
10330 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
10340 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
10350 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
10360 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
10370 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
10380 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
10390 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
103a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
103b0 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  x!=0 then the pa
103c0 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67  geSizeFixed flag
103d0 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
103e0 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
103f0 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
10400 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
10410 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
10420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10430 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
10440 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
10450 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
10460 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
10470 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10480 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
10490 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
104a0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
104b0 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
104c0 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
104d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
104e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
104f0 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
10500 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10510 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
10520 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
10530 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
10540 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
10550 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
10560 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
10570 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
10580 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
10590 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
105a0 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
105b0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
105c0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
105d0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
105e0 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
105f0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
10600 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
10610 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
10620 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
10630 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67  sert( !pBt->pPag
10640 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72  e1 && !pBt->pCur
10650 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
10660 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
10670 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
10680 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
10690 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
106a0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
106b0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
106c0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
106d0 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
106e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
106f0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
10700 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
10710 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
10720 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
10730 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 1;.  sqlite3Bt
10740 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10760 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
10770 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
10780 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
10790 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
107a0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
107b0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
107c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
107d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
107e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
107f0 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
10800 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
10810 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
10820 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
10830 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
10840 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
10850 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
10860 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
10870 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
10880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10890 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
108a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
108b0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
108c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
108d0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
108e0 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
108f0 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
10900 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10910 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
10920 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
10930 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
10940 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
10950 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
10960 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
10970 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
10980 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
10990 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
109a0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
109b0 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
109c0 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
109d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
109e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
109f0 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
10a00 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
10a10 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
10a20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10a30 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
10a40 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
10a50 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
10a60 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
10a70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10a80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
10a90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
10aa0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10ab0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
10ac0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
10ad0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
10ae0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
10af0 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
10b00 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
10b10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
10b20 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
10b30 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
10b40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
10b50 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
10b60 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
10b70 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
10b80 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
10b90 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
10ba0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
10bb0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
10bc0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
10bd0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
10be0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
10bf0 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
10c00 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
10c10 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
10c20 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
10c30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
10c40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
10c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
10c60 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
10c70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10c80 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
10c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10ca0 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
10cb0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
10cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
10cd0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
10ce0 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76  SizeFixed && (av
10cf0 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
10d00 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
10d10 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
10d20 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
10d30 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
10d40 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
10d50 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
10d60 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
10d70 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
10d80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10d90 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
10da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10db0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
10dc0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
10dd0 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
10de0 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
10df0 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
10e00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
10e10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10e20 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
10e30 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
10e40 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
10e50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
10e60 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
10e70 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
10e80 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
10e90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10ea0 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
10eb0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
10ec0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
10ed0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
10ee0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
10ef0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
10f00 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
10f10 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
10f20 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
10f30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10f40 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10f50 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
10f60 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
10f70 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
10f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10f90 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
10fa0 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
10fb0 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
10fc0 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
10fd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
10fe0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
10ff0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
11000 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
11010 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
11020 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
11030 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
11040 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
11050 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
11060 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
11070 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
11080 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
11090 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
110a0 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
110b0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
110c0 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
110d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
110e0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
110f0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61  Page1;.  int nPa
11100 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
11110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11120 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11130 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11140 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
11150 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11160 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
11170 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
11180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11190 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
111a0 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
111b0 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
111c0 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
111d0 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
111e0 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
111f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
11200 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
11210 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
11220 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
11230 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
11240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11250 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11260 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65  _failed;.  }else
11270 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
11280 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65      int pageSize
11290 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  ;.    int usable
112a0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
112b0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
112c0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
112d0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
112e0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
112f0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
11300 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
11310 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11320 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11330 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
11340 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
11350 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
11360 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
11370 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
11380 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11390 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
113a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
113b0 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
113c0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
113d0 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
113e0 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
113f0 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
11400 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
11410 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
11420 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
11430 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
11440 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
11450 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
11460 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
11470 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
11480 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
11490 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
114a0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
114b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
114c0 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
114d0 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
114e0 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
114f0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11500 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
11510 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74    pageSize = get
11520 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d  2byte(&page1[16]
11530 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
11540 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
11550 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a  e)!=0 || pageSiz
11560 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20  e<512 ||.       
11570 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47   (SQLITE_MAX_PAG
11580 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20  E_SIZE<32768 && 
11590 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
115a0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20  MAX_PAGE_SIZE). 
115b0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
115c0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
115d0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
115e0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
115f0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75  & 7)==0 );.    u
11600 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
11610 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
11620 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
11630 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
11640 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
11650 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
11660 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
11670 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
11680 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
11690 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
116a0 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
116b0 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
116c0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
116d0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
116e0 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
116f0 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
11700 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
11710 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
11720 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
11730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11740 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
11750 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
11760 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
11770 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
11780 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
11790 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
117a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
117b0 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
117c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36  sableSize = (u16
117d0 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  )usableSize;.   
117e0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
117f0 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
11800 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
11810 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
11820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11830 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
11840 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
11850 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11880 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
11890 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ze);.      if( r
118a0 63 20 29 20 67 6f 74 6f 20 70 61 67 65 31 5f 69  c ) goto page1_i
118b0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
118c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
118d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
118e0 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
118f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11900 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
11920 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
11930 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70  )pageSize;.    p
11940 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
11950 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
11960 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11970 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
11980 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
11990 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
119a0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
119b0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
119c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
119d0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
119e0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
119f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
11a00 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
11a10 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
11a20 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
11a30 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
11a40 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
11a50 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
11a60 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
11a70 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
11a80 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
11a90 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
11aa0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
11ab0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
11ac0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
11ad0 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
11ae0 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
11af0 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
11b00 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
11b10 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
11b20 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
11b30 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
11b40 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
11b50 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
11b60 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
11b70 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
11b80 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
11b90 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
11ba0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
11bb0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
11bc0 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
11bd0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
11be0 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
11bf0 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
11c00 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
11c10 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
11c20 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
11c30 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
11c40 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
11c50 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
11c60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
11c70 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
11c80 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
11c90 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
11ca0 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
11cb0 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
11cc0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
11cd0 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
11ce0 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
11cf0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
11d00 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
11d10 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
11d20 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
11d30 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
11d40 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
11d50 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
11d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
11d70 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
11d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
11d90 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
11da0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
11db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11dc0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
11dd0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
11de0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
11df0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
11e00 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
11e10 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
11e20 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
11e30 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
11e40 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
11e50 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
11e60 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
11e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
11e80 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
11e90 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
11ea0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
11eb0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
11ec0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
11ed0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
11ee0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11ef0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
11f00 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
11f10 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
11f20 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
11f30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11f40 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11f50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11f60 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  t( pBt->pCursor=
11f70 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
11f80 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
11f90 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
11fa0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
11fb0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
11fc0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
11fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
11fe0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
11ff0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
12000 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
12010 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
12020 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
12030 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
12040 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
12050 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
12060 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
12070 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
12080 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
12090 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
120a0 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
120b0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
120c0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
120d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
120e0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
120f0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
12100 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
12110 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
12120 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
12130 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
12140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12150 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12160 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12170 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12180 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
12190 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
121a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61  SQLITE_OK || nPa
121b0 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
121c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
121d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
121e0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
121f0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
12200 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
12210 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
12220 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
12230 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
12240 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
12250 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
12260 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
12270 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
12280 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
12290 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
122a0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
122b0 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65  a[16], pBt->page
122c0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38  Size);.  data[18
122d0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
122e0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
122f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
12300 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
12310 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
12320 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
12330 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12340 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
12350 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
12360 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
12370 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
12380 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
12390 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
123a0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
123b0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
123c0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
123d0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
123e0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
123f0 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
12400 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
12410 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12420 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
12430 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
12440 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
12450 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
12460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12470 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
12480 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
12490 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
124a0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
124b0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
124c0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
124d0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
124e0 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
124f0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
12500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12510 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
12520 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
12530 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
12540 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
12550 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
12560 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12570 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
12580 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
12590 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
125a0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
125b0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
125c0 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
125d0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
125e0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
125f0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
12600 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
12610 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
12620 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
12630 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
12640 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
12650 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
12660 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
12670 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
12680 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
12690 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
126a0 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
126b0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
126c0 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
126d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
126e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
126f0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
12700 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
12710 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
12720 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
12730 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
12740 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
12750 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
12760 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
12770 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
12780 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
12790 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
127a0 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
127b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
127c0 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
127d0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
127e0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
127f0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
12800 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
12810 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
12820 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
12830 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12840 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
12850 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
12860 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
12870 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
12880 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
12890 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
128a0 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
128b0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
128c0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
128d0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
128e0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
128f0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
12900 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
12910 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
12920 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
12930 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
12940 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
12950 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
12960 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
12970 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
12980 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
12990 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
129a0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
129b0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
129c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
129d0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
129e0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
129f0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
12a00 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
12a10 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
12a20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
12a30 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
12a40 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
12a50 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
12a60 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
12a70 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
12a80 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
12a90 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
12aa0 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
12ab0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
12ac0 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
12ad0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
12ae0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
12af0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
12b00 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
12b10 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
12b20 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
12b30 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
12b40 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
12b50 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
12b60 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
12b70 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
12b80 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
12b90 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
12ba0 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
12bb0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
12bc0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
12bd0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
12be0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
12bf0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
12c00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
12c10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12c20 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
12c30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
12c40 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12c50 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
12c60 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
12c70 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
12c80 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
12c90 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
12ca0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
12cb0 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
12cc0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
12cd0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
12ce0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
12cf0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
12d00 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
12d10 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
12d20 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
12d30 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
12d40 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
12d50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
12d60 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
12d70 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
12d80 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
12d90 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
12da0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
12db0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
12dc0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
12dd0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
12de0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
12df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12e00 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12e10 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
12e20 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12e30 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
12e40 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
12e50 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
12e60 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
12e70 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
12e80 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
12e90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
12ea0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
12eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
12ec0 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
12ed0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
12ee0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
12ef0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
12f00 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
12f10 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
12f20 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
12f30 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
12f40 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
12f50 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
12f60 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
12f70 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
12f80 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
12f90 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
12fa0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
12fb0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
12fc0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
12fd0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
12fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12ff0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
13000 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
13010 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
13020 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
13030 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13040 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
13050 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
13060 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
13070 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
13080 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
13090 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
130a0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
130b0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
130c0 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
130d0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
130e0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
130f0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
13100 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
13110 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
13120 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
13130 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 69  e opened. */.  i
13140 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
13150 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
13160 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
13170 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
13180 41 44 5f 4c 4f 43 4b 29 29 20 29 7b 0a 20 20 20  AD_LOCK)) ){.   
13190 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
131a0 6e 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20  n;.  }..  do {. 
131b0 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
131c0 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
131d0 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
131e0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
131f0 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
13200 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
13210 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
13220 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
13230 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
13240 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
13250 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
13260 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
13270 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
13280 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
13290 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
132a0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
132b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
132c0 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
132d0 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
132e0 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
132f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
13300 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
13310 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
13320 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
13330 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
13340 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
13350 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
13360 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
13370 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
13380 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
13390 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
133a0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
133b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72        if( pBt->r
133c0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
133d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
133e0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
133f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13400 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
13410 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
13420 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
13430 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
13440 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
13450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13470 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
13480 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
13490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
134a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
134b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
134c0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
134d0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
134e0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
134f0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
13500 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13510 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
13520 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
13530 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
13540 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
13550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13560 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
13570 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
13580 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
13590 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
135a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
135b0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
135c0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
135d0 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70  le ){..assert( p
135e0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
135f0 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
13600 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
13610 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
13620 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
13630 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
13640 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
13650 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
13660 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
13670 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13680 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
13690 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
136a0 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
136b0 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
136c0 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
136d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
136e0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
136f0 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
13700 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rans;.    }.#ifn
13710 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13720 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
13730 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
13740 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
13750 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
13760 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
13770 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
13780 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28  >isExclusive = (
13790 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20  u8)(wrflag>1);. 
137a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
137b0 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
137c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
137d0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
137e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
137f0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
13800 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
13810 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
13820 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
13830 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
13840 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
13850 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
13860 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
13870 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
13880 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
13890 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
138a0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
138b0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
138c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
138d0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
138e0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
138f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
13900 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
13910 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
13920 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13940 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13950 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13960 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
13970 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
13980 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
13990 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
139a0 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
139b0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
139c0 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
139d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
139e0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
139f0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
13a00 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
13a10 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
13a20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13a30 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
13a40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
13a50 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
13a80 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
13a90 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
13ac0 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
13ad0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13b00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
13b10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
13b20 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
13b30 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
13b40 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
13b50 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
13b60 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
13b70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13b80 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
13b90 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
13ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
13bb0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
13bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13bd0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
13be0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
13bf0 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
13c00 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
13c10 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
13c20 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
13c30 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
13c40 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
13c50 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
13c60 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
13c70 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
13c80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13c90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
13ca0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
13cb0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
13cc0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
13cd0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
13ce0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
13cf0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
13d00 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
13d10 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
13d20 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
13d30 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
13d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13d50 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
13d60 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
13d70 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
13d80 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
13d90 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
13da0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
13db0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
13dc0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
13dd0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
13de0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
13df0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
13e00 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
13e10 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
13e20 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
13e30 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
13e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13e50 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
13e60 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
13e70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
13e80 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
13e90 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
13ea0 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
13eb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
13ec0 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
13ed0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
13ee0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
13ef0 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
13f00 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
13f10 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
13f20 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
13f30 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
13f40 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
13f50 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
13f60 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
13f70 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
13f80 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
13f90 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
13fa0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
13fb0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
13fc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
13fd0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
13fe0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
13ff0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
14000 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14020 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
14030 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
14040 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
14050 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
14060 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
14070 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
14080 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
14090 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
140a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
140b0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
140c0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
140d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
140e0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
140f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
14100 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
14110 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
14120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14130 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
14140 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
14150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
14160 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
14170 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
14180 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
14190 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
141a0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
141b0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
141c0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
141d0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
141e0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
141f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
14200 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
14210 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
14220 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14230 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14240 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
14250 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
14260 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
14270 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
14280 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
14290 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
142a0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
142b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
142c0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
142d0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
142e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
142f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
14300 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
14310 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
14320 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
14330 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
14340 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
14350 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
14360 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
14370 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
14380 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
14390 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
143a0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
143b0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
143c0 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
143d0 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
143e0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
143f0 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
14400 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
14410 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
14420 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
14430 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14450 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
14460 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
14470 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
14480 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
14490 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
144a0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
144b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
144c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
144d0 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
144e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
144f0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
14500 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
14510 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
14520 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
14530 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
14540 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
14550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14560 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14570 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
14580 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
14590 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
145a0 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
145b0 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
145c0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
145d0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
145e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
145f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
14600 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
14610 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
14620 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
14630 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
14640 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
14650 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
14660 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
14670 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
14680 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
14690 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
146a0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
146b0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
146c0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
146d0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
146e0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
146f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
14700 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
14710 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
14720 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
14730 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
14740 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
14750 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
14760 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
14770 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
14780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14790 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
147a0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
147b0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b   int isCommit.){
147c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
147d0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
147e0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
147f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
14800 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
14810 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
14820 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
14830 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
14840 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
14850 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
14860 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
14870 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
14880 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
14890 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
148a0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
148b0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
148c0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
148d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
148e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
148f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
14900 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
14910 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
14920 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
14930 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
14940 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
14950 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
14960 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
14970 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
14980 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
14990 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
149a0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
149b0 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
149c0 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
149d0 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
149e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
149f0 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
14a00 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
14a10 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
14a20 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
14a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14a40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14a50 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
14a60 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
14a70 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
14a80 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
14a90 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
14aa0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
14ab0 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
14ac0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
14ad0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
14ae0 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
14af0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
14b00 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
14b10 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
14b20 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
14b30 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
14b40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
14b50 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
14b60 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
14b70 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
14b80 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
14b90 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
14ba0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
14bb0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
14bc0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
14bd0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
14be0 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
14bf0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
14c00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
14c10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
14c20 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
14c30 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
14c40 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
14c50 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
14c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14c90 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
14ca0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
14cb0 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
14cc0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
14cd0 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
14ce0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
14cf0 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
14d00 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
14d10 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
14d20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14d60 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
14d70 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
14d80 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
14d90 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
14da0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
14db0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
14dc0 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
14dd0 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
14de0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
14df0 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
14e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
14e10 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
14e20 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
14e30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
14e40 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
14e50 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
14e60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14e90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14ea0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
14eb0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
14ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14ee0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
14ef0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
14f00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14f10 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
14f20 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
14f30 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
14f40 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
14f50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
14f60 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
14f70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14f80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
14f90 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
14fa0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
14fb0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
14fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14fd0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
14fe0 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
14ff0 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
15000 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
15010 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
15020 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
15030 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
15040 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
15050 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
15060 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
15070 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
15080 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
15090 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
150a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
150b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
150c0 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
150d0 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69  refore no.** poi
150e0 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68  nt in calling th
150f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
15100 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
15110 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  E_DONE..**.** Mo
15120 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
15130 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
15140 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
15150 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74  nize the .** dat
15160 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
15170 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
15180 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
15190 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e  y in use.** is n
151a0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
151b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46  .**.** If the nF
151c0 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  in parameter is 
151d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d  non-zero, the im
151e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
151f0 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
15200 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
15210 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
15220 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
15230 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
15240 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
15250 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
15260 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
15270 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15290 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
152a0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
152b0 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
152c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
152d0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
152e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
152f0 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
15300 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20  LastPg){.  Pgno 
15310 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
15320 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15330 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
15340 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
15350 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
15360 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15370 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15380 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
15390 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
153a0 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
153b0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
153c0 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
153d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
153e0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
153f0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
15400 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
15410 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
15420 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
15430 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
15440 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
15450 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
15460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15470 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
15480 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
15490 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
154a0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
154b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
154c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
154d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
154e0 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
154f0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
15500 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15510 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15520 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
15530 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
15540 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
15550 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
15560 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
15570 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
15580 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
15590 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
155a0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
155b0 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
155c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
155d0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
155e0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
155f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
15600 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
15610 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
15620 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
15630 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
15640 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
15650 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
15660 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
15670 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
15680 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
15690 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
156a0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
156b0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
156c0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
156d0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
156e0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
156f0 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
15700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
15720 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15730 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
15740 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
15750 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
15760 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
15770 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
15780 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
15790 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
157a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
157b0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
157c0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
157d0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
157e0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
157f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15800 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
15810 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
15820 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
15830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15850 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15860 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
15870 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
15880 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
15890 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
158a0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
158b0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
158c0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
158d0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
158e0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
158f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15900 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
15910 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
15920 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
15930 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
15940 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
15950 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
15960 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
15970 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
15980 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
15990 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
159a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
159b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
159c0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
159d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
159e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
159f0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
15a00 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
15a10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
15a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a30 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
15a40 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
15a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
15a60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15a70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15a80 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
15a90 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
15aa0 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
15ab0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15ac0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
15ad0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
15ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15af0 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
15b00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
15b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
15b30 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
15b40 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
15b50 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
15b60 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
15b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15b80 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
15b90 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
15ba0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15bb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15bc0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
15bd0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
15be0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
15bf0 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
15c00 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
15c10 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
15c20 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
15c30 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
15c40 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
15c50 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
15c60 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
15c70 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
15c80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
15c90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
15ca0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
15cb0 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
15cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15d10 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
15d20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
15d30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
15d40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15d50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15d60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15d70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
15d80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73      }.      iLas
15d90 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  tPg--;.    }.   
15da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
15db0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
15dc0 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29  pPager, iLastPg)
15dd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15de0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15df0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
15e00 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
15e10 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
15e20 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
15e30 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
15e40 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
15e50 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
15e60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
15e70 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
15e80 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
15e90 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
15ea0 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
15eb0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
15ec0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
15ed0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15ee0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
15ef0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
15f00 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
15f10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15f20 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
15f30 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
15f40 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
15f50 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
15f60 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
15f70 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
15f80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15f90 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
15fa0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
15fb0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
15fc0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15fd0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
15fe0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
15ff0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
16000 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
16010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
16020 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
16030 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
16040 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
16050 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56  ;.    rc = incrV
16060 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30  acuumStep(pBt, 0
16070 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  , pagerPagecount
16080 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71  (pBt));.  }.  sq
16090 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
160a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
160b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
160c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
160d0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
160e0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
160f0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
16100 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
16110 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
16120 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
16130 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
16140 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
16150 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
16160 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
16170 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
16180 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
16190 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
161a0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
161b0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
161c0 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
161d0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
161e0 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
161f0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
16200 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
16210 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
16220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
16230 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
16240 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
16250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16260 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
16270 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
16280 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
16290 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
162a0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
162b0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
162c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
162d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
162e0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
162f0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
16300 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
16310 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
16320 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
16330 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
16340 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20     Pgno nFin;.  
16350 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20    Pgno nFree;.  
16360 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
16370 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a      Pgno iFree;.
16380 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67      const int pg
16390 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  sz = pBt->pageSi
163a0 7a 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  ze;.    Pgno nOr
163b0 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ig = pagerPageco
163c0 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20 20 20 69  unt(pBt);..    i
163d0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
163e0 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
163f0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
16400 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
16410 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
16420 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
16430 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
16440 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
16450 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
16460 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
16470 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
16480 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
16490 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
164a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
164b0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
164c0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
164d0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
164e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
164f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
16510 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
16520 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
16530 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d  [36]);.    nPtrm
16540 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
16550 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
16560 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a  pBt, nOrig)+pgsz
16570 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20  /5)/(pgsz/5);.  
16580 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
16590 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
165a0 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e  ;.    if( nOrig>
165b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
165c0 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
165d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
165e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
165f0 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Fin--;.    }.   
16600 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
16610 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
16620 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
16630 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
16640 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
16650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16660 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
16670 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16680 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f  PT_BKPT;..    fo
16690 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
166a0 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
166b0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
166c0 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
166d0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
166e0 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
166f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16700 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
16710 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
16720 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
16730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16740 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63  ITE_OK;.      rc
16750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16760 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
16770 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16780 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
16790 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
167a0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
167b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
167c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
167d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
167e0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
167f0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
16800 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   nFin);.    }.  
16810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
16830 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
16840 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
16850 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
16860 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
16870 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
16880 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
16890 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
168a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
168b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
168c0 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
168d0 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
168e0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
168f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16900 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
16910 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
16920 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
16930 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
16940 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
16950 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
16960 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
16970 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
16980 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
16990 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
169a0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
169b0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
169c0 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
169d0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
169e0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
169f0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
16a00 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
16a10 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
16a20 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
16a30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
16a40 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
16a50 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
16a60 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
16a70 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
16a80 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
16a90 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
16aa0 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
16ab0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
16ad0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
16ae0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
16af0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
16b00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
16b10 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
16b20 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
16b30 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
16b40 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
16b50 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
16b60 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
16b70 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
16b80 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
16b90 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
16ba0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
16bb0 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
16bc0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
16bd0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
16be0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
16bf0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
16c00 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
16c10 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
16c20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
16c30 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
16c40 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
16c50 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
16c60 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
16c70 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
16c80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
16c90 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
16ca0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
16cb0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
16cc0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
16cd0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
16ce0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
16cf0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
16d00 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
16d10 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
16d20 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
16d30 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
16d40 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
16d50 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
16d60 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
16d70 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
16d80 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
16d90 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
16da0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
16db0 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
16dc0 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
16dd0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
16de0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
16df0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
16e00 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
16e10 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
16e20 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
16e30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
16e40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16e50 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
16e60 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
16e70 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
16e80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16e90 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
16ea0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
16eb0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
16ec0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
16ee0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
16ef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16f00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
16f10 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
16f20 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
16f30 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
16f40 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
16f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16f70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16f80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16f90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16fa0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
16fb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
16fc0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
16fd0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
16fe0 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
16ff0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17000 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17020 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17030 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
17040 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
17050 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
17060 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
17070 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
17080 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
17090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
170a0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
170b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
170c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
170d0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
170e0 20 2a 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74   *pCsr;.  assert
170f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
17100 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
17110 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
17120 61 20 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70  a cursor held op
17130 65 6e 20 62 79 20 74 68 69 73 20 62 2d 74 72 65  en by this b-tre
17140 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66  e connection. If
17150 20 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a   one exists,.  *
17160 2a 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * then the trans
17170 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  action will be d
17180 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72  owngraded to a r
17190 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
171a0 74 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61  tion.  ** instea
171b0 64 20 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f  d of actually co
171c0 6e 63 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65  ncluded. A subse
171d0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f  quent call to Co
171e0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a  mmitPhaseTwo() .
171f0 20 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b    ** or Rollback
17200 28 29 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74  () will finish t
17210 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
17220 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  nd unlock the da
17230 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f  tabase.  */.  fo
17240 72 28 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCsr=pBt->pCur
17250 73 6f 72 3b 20 70 43 73 72 20 26 26 20 70 43 73  sor; pCsr && pCs
17260 72 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43  r->pBtree!=p; pC
17270 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b  sr=pCsr->pNext);
17280 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 3d  .  assert( pCsr=
17290 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
172a0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a  >TRANS_NONE );..
172b0 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
172c0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69  ontent(pBt);.  i
172d0 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64  f( pCsr ){.    d
172e0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
172f0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
17300 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
17310 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
17320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
17330 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
17340 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
17350 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
17360 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
17370 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
17380 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
17390 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
173a0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
173b0 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
173c0 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
173d0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
173e0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
173f0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
17400 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
17410 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
17420 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
17430 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
17440 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
17450 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
17460 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
17470 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
17480 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
17490 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
174a0 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
174b0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
174c0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
174d0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
174e0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
174f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
17500 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
17510 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
17520 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
17530 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
17540 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
17550 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
17560 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
17570 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
17580 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
17590 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
175a0 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
175b0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
175c0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
175d0 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
175e0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
175f0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
17600 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
17610 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17620 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
17630 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
17640 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
17650 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
17660 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
17670 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
17680 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
17690 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
176a0 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
176b0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
176c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
176d0 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
176e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
176f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
17700 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
17710 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
17720 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
17730 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
17740 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
17750 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
17760 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
17770 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
17780 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
17790 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
177a0 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
177b0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
177c0 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
177d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
177e0 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
177f0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
17800 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
17810 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
17820 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
17830 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
17840 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
17850 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
17860 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
17870 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
17880 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
17890 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
178a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
178b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
178c0 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
178d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
178e0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
178f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17900 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17910 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
17920 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
17930 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17940 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
17950 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
17960 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
17970 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
17980 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
17990 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
179a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
179b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
179c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
179d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
179e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
179f0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
17a00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
17a10 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
17a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17a30 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
17a40 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
17a50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17a70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17a80 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
17a90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17aa0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17ab0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
17ac0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
17ad0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
17ae0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17af0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17b00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17b10 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
17b20 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
17b30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17b40 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
17b50 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
17b60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17b70 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
17b80 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17b90 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
17ba0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17bc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
17bd0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
17be0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17bf0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17c00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
17c10 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
17c20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17c30 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
17c40 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
17c50 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
17c60 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
17c70 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
17c80 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
17c90 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
17ca0 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
17cb0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
17cc0 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
17cd0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
17ce0 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  , a write-cursor
17cf0 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
17d00 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
17d10 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20  e of writing to 
17d20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68  the databse.  Th
17d30 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  at means the cur
17d40 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69  sor was.** origi
17d50 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  nally opened for
17d60 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65   writing and the
17d70 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
17d80 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62  be disabled.** b
17d90 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61  y having its sta
17da0 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55  te changed to CU
17db0 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73  RSOR_FAULT..*/.s
17dc0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
17dd0 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
17de0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
17df0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
17e00 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
17e10 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
17e20 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
17e30 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
17e40 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
17e50 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  g && pCur->eStat
17e60 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
17e70 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
17e80 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
17e90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17ea0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
17eb0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
17ec0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
17ed0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
17ee0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
17ef0 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
17f00 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
17f10 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
17f20 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
17f30 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
17f40 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
17f50 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
17f60 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
17f70 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
17f80 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
17f90 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
17fa0 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
17fb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17fc0 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
17fd0 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
17fe0 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
17ff0 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
18000 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
18010 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
18020 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
18030 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
18040 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
18050 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
18060 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
18070 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
18080 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
18090 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
180a0 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
180b0 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
180c0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
180d0 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
180e0 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
180f0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
18100 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18110 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
18120 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
18130 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
18140 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
18150 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18160 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72  r(pBtree);.  for
18170 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
18180 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18190 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
181a0 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   i;.    sqlite3B
181b0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
181c0 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74  p);.    p->eStat
181d0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
181e0 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20  ;.    p->skip = 
181f0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72  errCode;.    for
18200 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
18210 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
18220 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
18230 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
18240 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
18250 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
18260 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18270 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pBtree);.}../*.*
18280 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
18290 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
182a0 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
182b0 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
182c0 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
182d0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
182e0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
182f0 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
18300 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
18310 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
18320 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
18330 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
18340 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
18350 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
18360 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
18370 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18380 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
18390 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
183a0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
183b0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
183c0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
183d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
183e0 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29  llback(Btree *p)
183f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
18400 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18410 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
18420 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69  *pPage1;..  sqli
18430 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18440 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ;.  rc = saveAll
18450 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
18460 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
18470 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
18480 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
18490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
184a0 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
184b0 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
184c0 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
184d0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  () error occurre
184e0 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
184f0 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
18500 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
18510 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
18520 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
18530 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
18540 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
18550 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
18560 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
18570 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
18580 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
18590 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
185a0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
185b0 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
185c0 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
185d0 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
185e0 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
185f0 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
18600 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
18610 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
18620 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
18630 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
18640 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
18650 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
18660 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
18670 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
18680 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
18690 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
186a0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
186b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
186c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
186d0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
186e0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
186f0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
18700 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
18710 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
18720 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
18730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
18740 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
18750 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
18760 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
18770 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
18780 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
18790 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
187a0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
187b0 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
187c0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
187d0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
187e0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
187f0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
18800 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
18810 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
18820 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
18830 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
18840 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
18850 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
18860 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18870 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18880 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
18890 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
188a0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
188b0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
188c0 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
188d0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
188e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
188f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18910 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
18920 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
18930 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
18940 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
18950 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
18960 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
18970 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
18980 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
18990 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
189a0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
189b0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
189c0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
189d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
189e0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
189f0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
18a00 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
18a10 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
18a20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
18a30 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
18a40 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
18a50 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
18a60 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
18a70 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
18a80 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
18a90 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
18aa0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
18ab0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
18ac0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
18ad0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
18ae0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
18af0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
18b00 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
18b10 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
18b20 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
18b30 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
18b40 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
18b50 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
18b60 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
18b70 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
18b80 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
18b90 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
18ba0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18bb0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
18bc0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
18bd0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
18be0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
18bf0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
18c00 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
18c10 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
18c20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
18c30 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
18c40 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
18c50 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
18c60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
18c70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
18c80 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
18c90 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
18ca0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
18cb0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
18cc0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
18cd0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
18ce0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
18cf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18d00 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
18d10 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
18d20 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
18d30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18d40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
18d50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18d70 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18d80 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
18d90 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d  ( pBt->readOnly=
18da0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18db0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
18dc0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
18dd0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
18de0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20  epoint );.  if( 
18df0 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73  NEVER(p->inTrans
18e00 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
18e10 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
18e20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18e30 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d  TE_INTERNAL;.  }
18e40 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
18e50 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
18e60 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
18e70 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74  E );.    /* At t
18e80 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
18e90 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
18ea0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
18eb0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20  epoint with.    
18ec0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
18ed0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
18ee0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
18ef0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
18f00 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  .    ** SQL stat
18f10 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
18f20 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
18f30 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
18f40 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  ck any.    ** su
18f50 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
18f60 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
18f70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
18f80 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
18f90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
18fa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
18fb0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
18fc0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
18fd0 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ment);.  }.  sql
18fe0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18ff0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19000 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
19010 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
19020 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
19030 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
19040 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
19050 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
19060 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
19070 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
19080 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
19090 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
190a0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
190b0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
190c0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
190d0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
190e0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
190f0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
19100 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
19110 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
19120 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
19130 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
19140 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19150 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
19160 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
19170 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
19180 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
19190 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
191a0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
191b0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
191c0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
191d0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
191e0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
191f0 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
19200 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
19210 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
19220 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
19230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19240 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
19250 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
19260 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
19270 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19280 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
19290 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
192a0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
192b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
192c0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
192d0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
192e0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
192f0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
19300 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
19310 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
19320 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
19330 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
19340 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
19350 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
19360 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19380 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
19390 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
193a0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
193b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
193c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e   ){.      rc = n
193d0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
193e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
193f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19420 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
19430 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
19440 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
19450 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
19460 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
19470 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
19480 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
19490 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
194a0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
194b0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
194c0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
194d0 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
194e0 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
194f0 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
19500 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
19510 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
19520 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
19530 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
19540 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
19550 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
19560 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
19570 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
19580 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
19590 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
195a0 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
195b0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
195c0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
195d0 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
195e0 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
195f0 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
19600 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
19610 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
19620 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
19630 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
19640 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
19650 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
19660 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
19670 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
19680 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
19690 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
196a0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
196b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
196c0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
196d0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
196e0 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
196f0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
19700 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
19710 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
19720 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
19730 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
19740 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
19750 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
19760 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
19770 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
19780 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
19790 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
197a0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
197b0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
197c0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
197d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
197e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
197f0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
19800 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
19810 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
19820 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
19830 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
19840 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
19850 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
19860 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
19870 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
19880 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
19890 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
198a0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
198b0 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
198c0 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
198d0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
198e0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
198f0 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
19900 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
19910 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
19920 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62  eeCursorSize() b
19930 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a  ytes of memory .
19940 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
19950 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20   pCur have been 
19960 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61  zeroed by the ca
19970 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
19980 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
19990 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
199c0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
199d0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
19a00 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
19a10 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
19a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a40 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
19a50 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
19a60 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
19a70 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
19a80 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
19a90 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
19aa0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
19ab0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
19ae0 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
19af0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19b20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
19b30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19b40 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
19b50 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
19b60 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
19b70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
19b80 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
19b90 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
19ba0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
19bb0 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20  wrFlag==1 );..  
19bc0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
19bd0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
19be0 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
19bf0 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
19c00 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
19c10 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
19c20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
19c30 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
19c40 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
19c50 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
19c60 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
19c70 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
19c80 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
19c90 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
19ca0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
19cb0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
19cc0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
19cd0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
19ce0 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67  yInfo!=0, wrFlag
19cf0 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
19d00 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
19d10 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
19d20 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
19d30 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
19d40 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
19d50 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
19d60 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
19d70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
19d80 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
19d90 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
19da0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
19db0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19dc0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
19dd0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
19de0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
19df0 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ata );..  if( NE
19e00 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70 42  VER(wrFlag && pB
19e10 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
19e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19e30 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
19e40 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
19e50 26 26 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  && pagerPagecoun
19e60 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
19e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19e80 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  MPTY;.  }..  pCu
19e90 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
19ea0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63  gno)iTable;.  rc
19eb0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
19ec0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
19ed0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
19ee0 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20  Page[0]);.  if( 
19ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
19f10 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 30 20  r->apPage[0]==0 
19f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
19f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
19f40 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
19f50 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
19f60 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
19f70 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
19f80 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
19f90 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
19fa0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
19fb0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
19fc0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
19fd0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
19fe0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
19ff0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1a000 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
1a010 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
1a020 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1a030 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1a040 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1a050 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1a060 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1a070 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1a080 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1a090 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a0a0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
1a0b0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1a0c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1a0d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1a0e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1a0f0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1a130 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1a170 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1a180 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1b0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1a1c0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1a1d0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1a1e0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1a1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a200 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1a210 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1a220 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1a250 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1a260 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1a270 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a280 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1a290 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1a2a0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1a2b0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1a2c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a2d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a2e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a2f0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1a300 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1a310 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1a320 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1a330 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1a340 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1a350 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1a360 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1a370 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1a380 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1a390 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1a3a0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1a3b0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1a3c0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1a3d0 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1a3e0 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1a3f0 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1a400 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1a410 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1a420 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1a430 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  n sizeof(BtCurso
1a440 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
1a450 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1a460 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  d value of every
1a470 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73   cursor in the s
1a480 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
1a490 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64  e.** as pCur and
1a4a0 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65   having the same
1a4b0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
1a4c0 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20  r as pCur.  The 
1a4d0 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20  value is.** set 
1a4e0 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a  to iRowid..**.**
1a4f0 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72   Only positive r
1a500 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20  owid values are 
1a510 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64  considered valid
1a520 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e   for this cache.
1a530 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73  .** The cache is
1a540 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1a550 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67  zero, indicating
1a560 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68   an invalid cach
1a570 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69  e..** A btree wi
1a580 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74  ll work fine wit
1a590 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  h zero or negati
1a5a0 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a  ve rowids.  We j
1a5b0 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61  ust cannot.** ca
1a5c0 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  che zero or nega
1a5d0 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69  tive rowids, whi
1a5e0 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20  ch means tables 
1a5f0 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72  that use zero or
1a600 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77  .** negative row
1a610 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ids might run a 
1a620 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
1a630 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c  But in practice,
1a640 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61   zero.** or nega
1a650 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20  tive rowids are 
1a660 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f  very uncommon so
1a670 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
1a680 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
1a690 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1a6a0 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69  reeSetCachedRowi
1a6b0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1a6c0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1a6d0 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72  iRowid){.  BtCur
1a6e0 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1a6f0 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73  pCur->pBt->pCurs
1a700 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1a710 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  t){.    if( p->p
1a720 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70  gnoRoot==pCur->p
1a730 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63  gnoRoot ) p->cac
1a740 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  hedRowid = iRowi
1a750 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
1a760 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1a770 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a  id==iRowid );.}.
1a780 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a790 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66  e cached rowid f
1a7a0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
1a7b0 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65  sor.  A negative
1a7c0 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75   or zero.** retu
1a7d0 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
1a7e0 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  es that the rowi
1a7f0 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c  d cache is inval
1a800 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
1a810 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  .** ignored.  If
1a820 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1a830 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
1a840 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e  e been set, then
1a850 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65   a.** zero is re
1a860 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  turned..*/.sqlit
1a870 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1a880 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f  BtreeGetCachedRo
1a890 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
1a8a0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
1a8b0 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b  ur->cachedRowid;
1a8c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1a8d0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
1a8e0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1a8f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a900 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
1a910 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
1a920 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
1a930 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a940 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
1a950 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
1a960 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
1a970 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
1a980 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1a990 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
1a9a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1a9b0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1a9c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1a9d0 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
1a9e0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1a9f0 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  r(pCur);.    if(
1aa00 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
1aa10 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
1aa20 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
1aa30 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
1aa40 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
1aa50 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
1aa60 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
1aa70 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1aa80 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
1aa90 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1aaa0 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
1aab0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1aac0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1aad0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1aae0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1aaf0 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
1ab00 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1ab10 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69  used(pBt);.    i
1ab20 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
1ab30 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
1ab40 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
1ab50 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
1ab60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ab70 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1ab80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ab90 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1aba0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d  ITE_TEST./*.** M
1abb0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
1abc0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
1abd0 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
1abe0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
1abf0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
1ac00 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
1ac10 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
1ac20 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
1ac30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1ac40 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
1ac50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ac60 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
1ac70 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
1ac80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ac90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1aca0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  ;.  memcpy(pTemp
1acb0 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
1acc0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20  f(BtCursor));.  
1acd0 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
1ace0 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
1acf0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f  >pPrev = 0;.  fo
1ad00 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43  r(i=0; i<=pTempC
1ad10 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1ad20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1ad30 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61  rRef(pTempCur->a
1ad40 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
1ad50 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
1ad60 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79  ( pTempCur->pKey
1ad70 3d 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ==0 );.}.#endif 
1ad80 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
1ad90 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
1ada0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  _TEST./*.** Dele
1adb0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
1adc0 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
1add0 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
1ade0 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
1adf0 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
1ae00 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
1ae10 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
1ae20 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
1ae30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ae40 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1ae50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ae60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
1ae70 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
1ae80 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1ae90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1aea0 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
1aeb0 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
1aec0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1aed0 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d  e(pCur->pKey);.}
1aee0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aef0 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  E_TEST */../*.**
1af00 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1af10 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1af20 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1af30 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1af40 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1af50 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1af60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1af70 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69  id, call.** sqli
1af80 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1af90 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1afa0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1afb0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1afc0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1afd0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1afe0 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1aff0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1b000 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1b010 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
1b020 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1b030 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1b040 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1b050 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1b060 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1b070 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1b080 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1b090 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1b0a0 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1b0b0 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1b0c0 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1b0d0 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1b0e0 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1b0f0 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1b100 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1b110 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1b120 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1b130 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1b140 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1b150 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1b160 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1b170 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1b180 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1b190 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1b1a0 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1b1b0 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1b1c0 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1b1d0 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1b1e0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1b1f0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1b200 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1b210 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1b220 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1b230 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1b240 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1b250 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1b260 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
1b270 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1b280 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1b290 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1b2a0 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1b2b0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1b2c0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
1b2d0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
1b2e0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
1b2f0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
1b300 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
1b310 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
1b320 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
1b330 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
1b340 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
1b350 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
1b360 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
1b370 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
1b380 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
1b390 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b3a0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1b3b0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1b3c0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
1b3d0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1b3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b3f0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1b400 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1b410 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1b420 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1b430 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1b440 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1b450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1b460 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1b470 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
1b480 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
1b490 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
1b4a0 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
1b4b0 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
1b4c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
1b4d0 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
1b4e0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
1b4f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b530 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
1b540 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1b550 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
1b590 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1b5a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
1b5e0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1b5f0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1b600 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1b610 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1b620 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1b630 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1b680 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1b6d0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1b6e0 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1b720 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1b730 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
1b740 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1b750 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1b760 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1b770 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1b780 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1b790 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1b7a0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1b7b0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1b7c0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1b7d0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1b7e0 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1b7f0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1b800 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1b810 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1b820 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1b830 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1b840 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b850 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1b860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b870 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1b880 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1b890 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1b8a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1b8b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b8c0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1b8d0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1b8e0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1b8f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b900 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1b910 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b920 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
1b930 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b940 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1b950 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1b960 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1b970 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
1b980 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1b990 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1b9a0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1b9b0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1b9c0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
1b9d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b9e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1b9f0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1ba00 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1ba10 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1ba20 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1ba30 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1ba40 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
1ba50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1ba60 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1ba70 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
1ba80 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1ba90 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
1baa0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
1bab0 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
1bac0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
1bad0 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
1bae0 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
1baf0 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
1bb00 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
1bb10 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1bb20 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1bb30 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1bb40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1bb50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1bb60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1bb70 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1bb80 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1bb90 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1bba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1bbb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1bbc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1bbd0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1bbe0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1bbf0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
1bc00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bc10 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1bc20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
1bc30 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
1bc40 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
1bc50 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
1bc60 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
1bc70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
1bc80 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1bc90 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
1bca0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
1bcb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1bcc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bcd0 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1bce0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1bcf0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1bd00 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1bd10 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1bd20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1bd30 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1bd40 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1bd50 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1bd60 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1bd70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1bd80 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1bd90 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1bda0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1bdb0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1bdc0 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1bdd0 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1bde0 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1bdf0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1be00 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1be10 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1be20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1be30 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1be40 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1be50 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1be60 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1be70 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1be80 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1be90 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1bea0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1beb0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1bec0 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1bed0 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1bee0 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1bef0 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1bf00 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1bf10 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1bf20 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1bf30 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1bf40 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1bf50 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1bf60 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1bf70 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1bf80 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1bf90 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1bfa0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1bfb0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1bfc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1bfd0 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1bfe0 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1bff0 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1c000 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1c010 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1c020 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1c030 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1c040 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1c050 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1c060 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1c070 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1c080 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1c090 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1c0a0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1c0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1c0d0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1c100 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1c110 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1c120 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1c130 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1c140 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1c150 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1c160 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1c170 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1c180 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1c190 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1c1a0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1c1b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1c1c0 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1c1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1c1e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c1f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1c200 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1c210 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1c220 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c230 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c240 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1c250 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1c260 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1c270 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1c280 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1c290 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1c2a0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1c2b0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1c2c0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1c2d0 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1c2e0 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1c2f0 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1c300 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1c310 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1c320 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1c330 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1c340 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1c350 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1c360 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1c370 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1c380 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1c390 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1c3a0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1c3b0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1c3c0 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1c3d0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1c3e0 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1c3f0 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1c400 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1c410 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1c420 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1c430 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65  if( iGuess<=page
1c440 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
1c450 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1c460 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1c470 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1c480 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1c490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c4a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c4b0 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1c4c0 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1c4d0 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1c4e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c4f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1c500 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1c510 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
1c520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c530 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c540 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1c550 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
1c560 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51     assert(rc==SQ
1c570 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c580 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ==0);.    if( ne
1c590 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  xt==0 && rc==SQL
1c5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c5b0 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
1c5c0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1c5d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
1c5e0 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
1c5f0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
1c600 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
1c610 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
1c620 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1c630 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1c640 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
1c650 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
1c660 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
1c670 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
1c680 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
1c690 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
1c6a0 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
1c6b0 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
1c6c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1c6d0 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
1c6e0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1c6f0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
1c700 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
1c710 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
1c720 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1c730 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
1c740 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
1c750 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
1c760 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
1c770 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
1c780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c790 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1c7a0 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
1c7b0 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
1c7c0 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
1c7d0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1c7e0 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
1c7f0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1c800 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1c810 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
1c820 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
1c830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1c840 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
1c850 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
1c860 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c870 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
1c880 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
1c8b0 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
1c8c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1c8d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c8e0 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
1c8f0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c910 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
1c920 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
1c930 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
1c940 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
1c950 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
1c960 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
1c970 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
1c980 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
1c990 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
1c9a0 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
1c9b0 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
1c9c0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
1c9d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c9e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1c9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ca00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ca10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
1ca20 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
1ca30 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
1ca40 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
1ca50 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
1ca60 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
1ca70 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
1ca80 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
1ca90 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
1caa0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1cab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1cac0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cad0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
1cae0 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
1caf0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1cb00 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
1cb10 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
1cb20 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1cb30 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
1cb40 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
1cb50 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
1cb60 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1cb70 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
1cb80 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
1cb90 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
1cba0 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
1cbb0 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
1cbc0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1cbd0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
1cbe0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
1cbf0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
1cc00 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
1cc10 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
1cc20 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
1cc30 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
1cc40 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
1cc50 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
1cc60 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
1cc70 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
1cc80 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
1cc90 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
1cca0 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
1ccb0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
1ccc0 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
1ccd0 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
1cce0 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
1ccf0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1cd00 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1cd10 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
1cd20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
1cd30 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
1cd40 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1cd50 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
1cd60 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
1cd70 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
1cd80 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
1cd90 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
1cda0 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
1cdb0 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
1cdc0 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
1cdd0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1cde0 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
1cdf0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
1ce00 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
1ce10 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
1ce20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
1ce30 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
1ce40 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
1ce50 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
1ce60 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
1ce70 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1ce80 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1ce90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1cea0 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
1ceb0 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
1cec0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
1ced0 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
1cee0 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
1cef0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
1cf00 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
1cf10 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
1cf20 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
1cf30 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
1cf40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
1cf50 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
1cf60 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
1cf70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
1cf80 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
1cf90 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
1cfa0 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
1cfb0 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
1cfc0 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
1cfd0 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
1cfe0 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
1cff0 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
1d000 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
1d010 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
1d020 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1d030 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1d040 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1d050 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1d060 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
1d070 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
1d080 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
1d090 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
1d0a0 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
1d0b0 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
1d0c0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
1d0d0 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
1d0e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d0f0 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
1d100 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
1d110 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
1d120 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
1d130 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
1d140 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
1d150 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
1d160 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1d170 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1d180 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1d190 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1d1a0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1d1b0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1d1c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d1d0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1d1e0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1d1f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1d200 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1d210 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1d220 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1d230 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1d240 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d250 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d270 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1d280 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1d290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d2a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d2b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d2c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1d2d0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1d2e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1d2f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1d300 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d310 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d320 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1d330 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1d340 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1d350 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1d360 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1d370 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1d380 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1d390 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
1d3a0 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  ;..  if( skipKey
1d3b0 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
1d3c0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
1d3d0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
1d3e0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1d3f0 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61  Data .   || &aPa
1d400 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1d410 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
1d420 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
1d430 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
1d440 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
1d450 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
1d460 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1d470 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
1d480 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
1d490 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d4a0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1d4b0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
1d4c0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
1d4d0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
1d4e0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
1d4f0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
1d500 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
1d510 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
1d520 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
1d530 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
1d540 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1d550 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
1d560 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
1d570 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
1d580 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1d590 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
1d5a0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1d5b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1d5c0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
1d5d0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
1d5e0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1d5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
1d600 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
1d610 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
1d620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d630 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1d640 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
1d650 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1d660 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
1d670 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
1d680 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
1d690 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
1d6a0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
1d6b0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
1d6c0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1d6d0 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
1d6e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1d6f0 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
1d700 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
1d710 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1d720 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
1d730 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
1d740 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
1d750 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
1d760 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
1d770 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
1d780 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
1d790 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
1d7a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1d7b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
1d7c0 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
1d7d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1d7e0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1d7f0 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
1d800 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
1d810 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
1d820 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
1d830 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
1d840 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
1d850 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
1d860 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
1d870 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
1d880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d890 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
1d8a0 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
1d8b0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1d8c0 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
1d8d0 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
1d8e0 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
1d8f0 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
1d900 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
1d910 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1d920 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
1d930 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
1d940 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
1d950 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  l);.      if( nO
1d960 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  vfl && !pCur->aO
1d970 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1d980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1d990 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
1d9a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1d9b0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1d9c0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1d9d0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
1d9e0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
1d9f0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1da00 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
1da10 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
1da20 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
1da30 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
1da40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1da50 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1da60 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1da70 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
1da80 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
1da90 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
1daa0 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
1dab0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1dac0 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
1dad0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
1dae0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
1daf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1db00 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
1db10 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
1db20 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
1db30 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
1db40 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1db50 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
1db60 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
1db70 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1db80 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
1db90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
1dba0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1dbb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1dbc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1dbd0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
1dbe0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
1dbf0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1dc00 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1dc10 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
1dc20 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
1dc30 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1dc40 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1dc50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1dc60 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1dc70 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1dc80 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1dc90 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1dca0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1dcb0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1dcc0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1dcd0 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1dce0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1dcf0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1dd00 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1dd10 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1dd20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1dd30 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1dd40 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1dd50 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1dd60 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1dd70 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1dd80 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1dd90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1dda0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1ddb0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1ddc0 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1ddd0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1dde0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1ddf0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1de00 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1de10 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
1de20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1de30 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
1de40 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
1de50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
1de60 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
1de70 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
1de80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1de90 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
1dea0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
1deb0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
1dec0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
1ded0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
1dee0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
1def0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
1df00 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
1df10 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
1df20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
1df30 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
1df40 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
1df50 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
1df60 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1df70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
1df80 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
1df90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1dfa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dfb0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
1dfc0 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
1dfd0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1dfe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
1dff0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1e000 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
1e010 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
1e020 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
1e030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1e040 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
1e050 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
1e060 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1e070 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1e080 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
1e090 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1e0a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e0b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e0c0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1e0d0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
1e0e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e0f0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
1e100 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1e110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e120 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e140 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1e150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e160 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1e170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e180 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1e190 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
1e1a0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1e1b0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1e1c0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1e1d0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1e1e0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1e1f0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1e200 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1e210 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1e220 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e230 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1e240 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1e250 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1e260 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1e270 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1e280 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1e290 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1e2a0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1e2b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e2c0 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
1e2d0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1e2e0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1e2f0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1e300 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e310 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e320 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1e330 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1e340 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1e350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e360 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1e370 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e380 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1e390 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e3a0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1e3b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e3c0 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66  iPage] );.    if
1e3d0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
1e3e0 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
1e3f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e400 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e410 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1e420 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e430 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1e440 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e450 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1e460 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
1e470 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
1e480 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
1e490 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
1e4a0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1e4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e4c0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1e4d0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1e4e0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1e4f0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1e500 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1e510 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1e520 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1e530 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1e540 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1e550 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1e560 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1e570 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1e580 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1e590 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1e5a0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e5b0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1e5c0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1e5d0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1e5e0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1e5f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1e600 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
1e610 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1e620 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1e630 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1e640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e650 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e660 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
1e670 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1e680 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1e690 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
1e6a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1e6b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e6c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e6d0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1e6e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1e6f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1e710 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e720 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e740 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1e750 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e760 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1e770 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e780 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1e790 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1e7a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1e7b0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1e7c0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1e7d0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1e7e0 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
1e7f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e800 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1e810 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
1e820 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
1e830 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
1e840 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
1e850 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1e860 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
1e870 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
1e880 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
1e890 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
1e8a0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
1e8b0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
1e8c0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
1e8d0 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
1e8e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e8f0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
1e900 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
1e910 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
1e920 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
1e930 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1e940 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
1e950 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
1e960 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
1e970 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e980 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1e990 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
1e9a0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
1e9b0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
1e9c0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
1e9d0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
1e9e0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
1e9f0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
1ea00 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
1ea10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1ea20 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
1ea30 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
1ea40 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
1ea50 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
1ea60 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
1ea70 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
1ea80 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
1ea90 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
1eaa0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
1eab0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
1eac0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
1ead0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
1eae0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
1eaf0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
1eb00 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1eb10 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
1eb20 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
1eb30 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1eb40 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
1eb50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1eb60 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
1eb70 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
1eb80 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
1eb90 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
1eba0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1ebb0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1ebc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
1ebd0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
1ebe0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1ebf0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1ec00 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1ec10 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1ec20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
1ec30 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1ec40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1ec50 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
1ec60 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
1ec70 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
1ec80 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
1ec90 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1eca0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
1ecb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1ecc0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
1ecd0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
1ece0 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
1ecf0 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
1ed00 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
1ed10 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1ed20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ed30 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
1ed40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ed50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ed60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1ed70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ed80 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1ed90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1eda0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1edb0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1edc0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1edd0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
1ede0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1edf0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1ee00 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
1ee10 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
1ee20 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1ee30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1ee40 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
1ee50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1ee60 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70     nKey = (int)p
1ee70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1ee80 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
1ee90 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
1eea0 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
1eeb0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1eec0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
1eed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1eee0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1eef0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
1ef00 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
1ef10 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
1ef20 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
1ef30 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
1ef40 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
1ef50 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
1ef60 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
1ef70 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
1ef80 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
1ef90 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
1efa0 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
1efb0 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
1efc0 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
1efd0 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
1efe0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
1eff0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1f000 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
1f010 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
1f020 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1f030 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
1f040 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
1f050 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
1f060 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
1f070 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
1f080 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
1f090 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
1f0a0 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
1f0b0 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
1f0c0 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
1f0d0 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
1f0e0 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
1f0f0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
1f100 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
1f110 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1f120 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1f130 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
1f140 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
1f150 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
1f160 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
1f170 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
1f180 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1f190 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
1f1a0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1f1b0 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
1f1c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1f1d0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1f1e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f1f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1f200 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1f210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1f220 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f230 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1f240 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f250 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1f260 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1f270 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1f280 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1f290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f2a0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1f2b0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1f2c0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1f2d0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1f2e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f2f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f300 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f310 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f320 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f330 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1f340 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1f350 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1f360 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1f370 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1f380 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1f390 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
1f3a0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
1f3b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1f3c0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
1f3d0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
1f3e0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
1f3f0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
1f400 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
1f410 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
1f420 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
1f430 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
1f440 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f450 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
1f460 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
1f470 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
1f480 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
1f490 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1f4a0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
1f4b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f4c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f4d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f4e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f4f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1f500 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1f510 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
1f520 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
1f530 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
1f540 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
1f550 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1f560 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f570 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
1f580 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1f590 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
1f5a0 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
1f5b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f5c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
1f5d0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
1f5e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
1f5f0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
1f600 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
1f610 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1f620 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1f630 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
1f640 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
1f650 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1f660 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f670 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1f680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1f690 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1f6a0 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
1f6b0 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
1f6c0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
1f6d0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1f6e0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
1f6f0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1f700 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
1f710 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
1f720 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
1f730 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
1f740 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
1f750 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
1f760 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
1f770 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
1f780 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
1f790 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1f7a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
1f7b0 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
1f7c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1f7d0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
1f7e0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
1f7f0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
1f800 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
1f810 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
1f820 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
1f830 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
1f840 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
1f850 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
1f860 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
1f870 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
1f880 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
1f890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1f8a0 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
1f8b0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
1f8c0 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
1f8d0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
1f8e0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
1f8f0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
1f900 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1f910 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1f920 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1f930 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1f940 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1f950 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1f960 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1f970 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1f980 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1f990 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1f9a0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1f9b0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1f9c0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1f9d0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1f9e0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1f9f0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1fa00 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1fa10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fa20 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1fa30 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1fa40 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
1fa50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1fa60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1fa70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fa80 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1fa90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1faa0 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
1fab0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1fac0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1fad0 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
1fae0 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
1faf0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1fb00 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1fb10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1fb20 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
1fb30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fb40 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
1fb50 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1fb60 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
1fb70 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
1fb80 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
1fb90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1fba0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1fbb0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
1fbc0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1fbd0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1fbe0 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1fbf0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1fc00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1fc10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1fc20 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1fc30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
1fc40 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
1fc50 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
1fc60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1fc70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1fc80 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fc90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1fca0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
1fcb0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1fcc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1fcd0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
1fce0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1fcf0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1fd00 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
1fd10 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1fd20 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
1fd30 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
1fd40 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
1fd50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1fd60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
1fd70 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
1fd80 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
1fd90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fda0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1fdb0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
1fdc0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
1fdd0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
1fde0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
1fdf0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1fe00 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1fe10 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1fe20 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e[i]);.    }.  }
1fe30 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
1fe40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
1fe50 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
1fe60 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
1fe70 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
1fe80 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20  >apPage[0])).   
1fe90 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1fea0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1feb0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1fec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fed0 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70    }..  pRoot = p
1fee0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
1fef0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1ff00 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1ff10 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d  oRoot );.  pCur-
1ff20 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43  >iPage = 0;.  pC
1ff30 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
1ff40 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1ff50 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1ff60 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1ff70 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1ff80 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
1ff90 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
1ffa0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
1ffb0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
1ffc0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
1ffd0 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
1ffe0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1fff0 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
20000 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pRoot->pgno==1
20010 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20   );.    subpage 
20020 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
20030 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
20040 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
20050 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61     assert( subpa
20060 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72  ge>0 );.    pCur
20070 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
20080 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
20090 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
200a0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
200b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
200c0 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f  >eState = ((pRoo
200d0 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53  t->nCell>0)?CURS
200e0 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f  OR_VALID:CURSOR_
200f0 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20  INVALID);.  }.  
20100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20110 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
20120 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
20130 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
20140 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
20150 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
20160 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
20170 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
20180 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
20190 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
201a0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
201b0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
201c0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
201d0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
201e0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
201f0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
20200 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
20210 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
20220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
20230 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
20240 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20250 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20270 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20280 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
20290 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
202a0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
202b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
202c0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
202d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
202e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
202f0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
20300 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
20310 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
20320 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
20330 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20340 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ge]));.    rc = 
20350 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
20360 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
20370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20380 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
20390 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
203a0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
203b0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
203c0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
203d0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
203e0 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
203f0 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
20400 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
20410 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
20420 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
20430 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
20440 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
20450 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
20460 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
20470 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
20480 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
20490 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
204a0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
204b0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
204c0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
204d0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
204e0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
204f0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
20500 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
20510 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
20520 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
20530 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
20540 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
20550 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
20560 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20570 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
20580 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
20590 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
205a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
205b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
205c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
205d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
205e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
205f0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
20600 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20610 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
20620 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
20630 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
20640 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
20650 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
20660 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20670 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
20680 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
20690 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
206a0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
206b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
206c0 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  K ){.    pCur->a
206d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
206e0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
206f0 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  -1;.    pCur->in
20700 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
20710 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
20720 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
20730 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
20740 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
20750 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
20760 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
20770 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20780 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
20790 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
207a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
207b0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
207c0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
207d0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
207e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
207f0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
20800 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
20810 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
20820 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
20830 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
20840 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20850 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20860 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20870 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
20880 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
20890 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
208a0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
208b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
208c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
208d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
208e0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
208f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20900 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20910 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
20920 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
20930 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
20940 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
20950 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
20960 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20970 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
20980 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
20990 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
209a0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
209b0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
209c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
209d0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
209e0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
209f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
20a00 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
20a10 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
20a20 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
20a30 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
20a40 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
20a50 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
20a60 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
20a70 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
20a80 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
20a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20aa0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
20ab0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
20ac0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
20ad0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20ae0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20af0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20b00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20b10 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
20b20 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
20b30 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
20b40 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
20b50 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
20b60 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
20b70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
20b80 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
20b90 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61  State && pCur->a
20ba0 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20  tLast ){.#ifdef 
20bb0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
20bc0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
20bd0 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
20be0 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
20bf0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
20c00 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
20c10 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
20c20 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
20c30 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
20c40 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
20c50 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
20c60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20c70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
20c80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
20c90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
20ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
20cb0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20cc0 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
20cd0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20ce0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
20cf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20d00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20d10 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
20d20 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
20d30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
20d40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
20d50 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
20d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20d70 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
20d80 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
20d90 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
20da0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
20db0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
20dc0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
20dd0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
20de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
20df0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20e00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20e10 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
20e20 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
20e30 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
20e40 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72  Cur);.      pCur
20e50 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53  ->atLast = rc==S
20e60 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20  QLITE_OK ?1:0;. 
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 73 6f 20 74   the cursor so t
20ea0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
20eb0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
20ec0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
20ed0 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
20ee0 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
20ef0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
20f00 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
20f10 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
20f20 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
20f30 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
20f40 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
20f50 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
20f60 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
20f70 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
20f80 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
20f90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
20fa0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
20fb0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
20fc0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
20fd0 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
20fe0 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
20ff0 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
21000 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
21010 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
21020 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
21030 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
21040 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
21050 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
21060 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
21070 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
21080 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
21090 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
210a0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
210b0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
210c0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
210d0 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
210e0 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
210f0 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
21100 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
21110 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
21120 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
21130 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
21140 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
21150 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
21160 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
21170 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
211a0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
211b0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
211c0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
211d0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
211e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
211f0 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
21200 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
21210 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
21220 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
21230 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
21240 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
21250 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
21260 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
21270 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
21280 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
21290 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
212a0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
212b0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
212c0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
212e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
212f0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
21300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21310 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
21320 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
21330 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
21340 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
21350 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
21360 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
21370 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
21380 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
21390 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
213a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
213b0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
213c0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
213d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
213e0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
213f0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
21400 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
21410 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
21420 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
21430 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
21440 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
21450 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
21460 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21470 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21480 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21490 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
214a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
214b0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
214c0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
214d0 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
214e0 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
214f0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
21500 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
21510 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
21520 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
21530 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
21540 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21550 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
21560 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
21570 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
21580 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
21590 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
215a0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
215b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
215c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
215d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
215e0 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
215f0 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
21600 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
21610 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
21620 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21630 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
21640 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
21650 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
21660 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
21670 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
21680 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21690 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
216a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
216b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
216c0 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
216d0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
216e0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
216f0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
21700 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
21710 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
21720 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
21730 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
21740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21750 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
21760 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
21770 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
21780 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
21790 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
217a0 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
217b0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
217c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
217d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
217e0 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b  .    int c = -1;
217f0 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e    /* pRes return
21800 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70   if table is emp
21810 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f  ty must be -1 */
21820 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
21830 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
21840 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
21850 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  (!pPage->intKey 
21860 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c  && pIdxKey==0) |
21870 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20  | upr<0 ){.     
21880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
21890 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
218a0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
218b0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ish;.    }.    i
218c0 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
218d0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
218e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
218f0 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
21900 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
21910 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21920 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
21930 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
21940 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
21950 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
21960 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21970 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78  iPage]; /* Index
21980 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   of current cell
21990 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20   in pPage */.   
219a0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
219d0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
219e0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
219f0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
21a00 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
21a10 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
21a20 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
21a30 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
21a40 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
21a50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
21a60 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
21a70 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
21a80 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
21a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
21aa0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
21ab0 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
21ac0 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64  arint32(pCell, d
21ad0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
21ae0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
21af0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
21b00 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
21b10 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
21b20 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
21b30 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
21b40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
21b50 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
21b60 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
21b70 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
21b80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
21b90 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e  ert( nCellKey>in
21ba0 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
21bb0 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
21bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72    }.        pCur
21bd0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
21be0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
21bf0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
21c00 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
21c10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
21c20 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
21c30 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
21c40 33 32 37 36 38 20 62 79 74 65 73 2e 20 54 68 69  32768 bytes. Thi
21c50 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
21c60 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
21c70 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
21c80 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
21c90 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
21ca0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
21cb0 70 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20  page is at most 
21cc0 38 31 39 38 20 62 79 74 65 73 2c 20 77 68 69 63  8198 bytes, whic
21cd0 68 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  h may be stored 
21ce0 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
21cf0 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
21d00 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
21d10 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
21d20 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
21d30 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
21d40 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
21d50 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
21d60 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
21d70 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
21d80 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
21d90 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
21da0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
21db0 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
21dc0 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
21dd0 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
21de0 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
21df0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
21e00 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
21e10 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
21e20 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26  (nCell & 0x80) &
21e30 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  & nCell<=pPage->
21e40 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
21e50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
21e60 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
21e70 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
21e80 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
21e90 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
21ea0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
21eb0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
21ec0 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
21ed0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
21ee0 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
21ef0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
21f00 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
21f10 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21f20 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
21f30 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
21f40 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
21f50 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
21f60 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
21f70 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
21f80 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
21f90 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
21fa0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
21fb0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21fc0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
21fd0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
21fe0 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
21ff0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
22000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
22010 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
22020 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
22030 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
22040 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
22050 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
22060 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
22070 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
22080 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
22090 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
220a0 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
220b0 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
220c0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
220d0 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
220e0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
220f0 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
22100 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
22110 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
22120 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
22130 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
22140 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
22150 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
22160 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
22170 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
22180 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
22190 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
221a0 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20  e called. */.   
221b0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
221c0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
221d0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
221e0 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
221f0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
22200 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ize;.          s
22210 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
22220 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
22230 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
22240 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
22250 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
22260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
22270 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
22280 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
22290 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
222a0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
222b0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
222c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
222d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
222e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
222f0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
22300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
22310 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
22320 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
22330 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
22340 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 2c 20 30  *)pCellKey, 0, 0
22350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
22360 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22370 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
22380 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
22390 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
223a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
223b0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
223c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
223d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
223e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
223f0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
22400 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
22410 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
22420 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
22430 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
22440 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70  dx;.          up
22450 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20  r = lwr - 1;.   
22460 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22480 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
22490 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
224a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
224b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
224c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
224d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
224e0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
224f0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
22500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22510 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
22520 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
22530 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
22540 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
22560 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22570 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28  iPage] = (u16)((
22580 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20  lwr+upr)/2);.   
22590 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
225a0 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20  wr==upr+1 );.   
225b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
225c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
225d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
225e0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
225f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
22600 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
22610 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
22620 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
22630 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
22640 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
22650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22660 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
22670 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
22680 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
22690 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
226a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
226b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
226c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
226d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
226e0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
226f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
22700 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
22710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22720 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
22730 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22740 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
22750 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22760 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
22770 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
22780 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
22790 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
227a0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
227b0 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
227c0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
227d0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
227e0 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  ish;.  }.moveto_
227f0 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e  finish:.  return
22800 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
22810 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
22820 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
22830 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
22840 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
22850 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
22860 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
22870 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
22880 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
22890 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
228a0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
228b0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
228c0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
228d0 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
228e0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
228f0 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
22900 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
22910 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
22920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22930 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
22940 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
22950 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
22960 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
22970 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
22980 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
22990 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
229a0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
229b0 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
229c0 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
229d0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
229e0 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
229f0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
22a00 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
22a10 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
22a20 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
22a30 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
22a40 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
22a50 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
22a60 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
22a70 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
22a80 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
22a90 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
22aa0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
22ab0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
22ac0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
22ad0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
22ae0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
22af0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
22b00 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
22b10 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
22b20 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
22b30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22b40 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
22b50 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
22b60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22b70 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
22b80 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22b90 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
22ba0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
22bb0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
22bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22bd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22be0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
22bf0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
22c00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
22c10 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
22c20 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
22c30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22c40 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
22c50 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
22c60 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
22c70 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
22c80 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
22c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
22ca0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
22cb0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
22cc0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22cd0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
22ce0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22cf0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
22d00 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
22d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
22d20 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
22d30 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
22d40 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
22d50 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
22d60 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
22d70 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
22d80 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
22d90 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
22da0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
22db0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
22dc0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
22dd0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
22de0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
22df0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22e00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
22e10 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
22e20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22e30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22e40 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
22e50 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
22e60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
22e70 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
22e80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
22e90 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22ea0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22eb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22ec0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
22ed0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
22ee0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
22ef0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
22f00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22f10 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
22f20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22f30 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
22f40 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
22f50 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
22f60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
22f70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22f80 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
22f90 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
22fa0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
22fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
22fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22fd0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
22fe0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
22ff0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
23000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23010 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
23020 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
23030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
23040 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
23050 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
23060 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
23070 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
23080 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
23090 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
230a0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
230b0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
230c0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
230d0 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
230e0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
230f0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
23100 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
23110 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
23120 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
23130 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
23140 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
23150 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
23160 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
23170 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
23180 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23190 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
231a0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
231b0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
231c0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
231d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
231e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
231f0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
23200 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
23210 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
23220 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
23230 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
23240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23250 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
23260 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
23270 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
23280 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
232a0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
232b0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
232c0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
232d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
232e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
232f0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
23300 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
23310 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
23320 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23330 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
23340 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
23350 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
23360 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
23370 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
23380 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
23390 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
233a0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
233b0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
233c0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
233d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
233e0 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
233f0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
23400 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
23410 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
23420 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
23430 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
23440 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23460 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23470 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
23480 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
23490 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
234a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
234b0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
234c0 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
234d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
234e0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
234f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23500 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
23510 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
23520 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
23530 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23540 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
23550 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
23560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
23590 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
235a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
235b0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
235c0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
235d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
235e0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
235f0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
23600 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
23610 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
23620 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
23630 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
23640 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
23650 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
23660 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
23670 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
23680 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
23690 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
236a0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
236b0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
236c0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
236d0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
236e0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
236f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23700 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
23710 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
23720 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
23730 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
23740 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
23750 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
23760 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
23770 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
23780 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
23790 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
237a0 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
237b0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
237c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
237d0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
237e0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
237f0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
23800 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
23810 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
23820 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
23830 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
23840 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
23850 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
23860 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
23870 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
23880 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
23890 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
238a0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
238b0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
238c0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
238d0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
238e0 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
238f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
23900 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
23910 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
23920 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
23930 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
23940 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
23950 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
23960 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
23970 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
23980 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
23990 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
239a0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
239b0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
239c0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
239d0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
239e0 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
239f0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
23a00 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
23a10 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
23a20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
23a30 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
23a40 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
23a50 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
23a60 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
23a70 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
23a80 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
23a90 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
23aa0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
23ab0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
23ac0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
23ad0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
23ae0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
23af0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
23b00 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
23b10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23b20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
23b30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23b40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
23b50 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
23b60 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
23b70 78 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  xPage = pagerPag
23b80 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
23b90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
23ba0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
23bb0 0a 20 20 69 66 28 20 6e 3e 6d 78 50 61 67 65 20  .  if( n>mxPage 
23bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23bd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23be0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
23bf0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
23c00 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
23c10 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
23c20 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
23c30 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
23c40 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
23c50 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
23c60 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
23c70 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
23c80 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
23c90 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
23ca0 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
23cb0 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
23cc0 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
23cd0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
23ce0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
23cf0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
23d00 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
23d10 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
23d20 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
23d30 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
23d40 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
23d50 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
23d60 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
23d70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23d80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
23d90 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
23da0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
23db0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
23dc0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
23dd0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
23de0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
23df0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
23e00 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
23e10 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
23e20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
23e30 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23e40 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
23e50 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
23e60 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
23e70 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
23e80 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
23e90 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
23ea0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
23eb0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
23ec0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
23ed0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
23ee0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
23ef0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
23f00 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
23f10 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
23f20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
23f30 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
23f40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23f50 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
23f60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
23f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23f80 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
23f90 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
23fa0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
23fb0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
23fc0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
23fd0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
23fe0 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
23ff0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
24000 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
24010 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
24020 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
24030 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
24040 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
24050 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
24060 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
24070 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
24080 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
24090 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
240a0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
240b0 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
240c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
240d0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
240e0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
240f0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
24100 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
24110 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
24120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24130 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
24140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
24150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24160 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
24170 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
24180 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
24190 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
241a0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
241b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
241c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
241d0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
241e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
241f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
24200 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
24210 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
24220 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
24230 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
24240 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
24250 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
24260 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
24270 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
24280 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
24290 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
242a0 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
242b0 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
242c0 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
242d0 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
242e0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
242f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
24300 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
24310 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
24320 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24330 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
24340 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
24350 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
24360 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
24370 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
24380 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
24390 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
243a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
243b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
243c0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
243d0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
243e0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
243f0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
24400 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
24410 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
24420 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
24430 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
24440 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
24450 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24460 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
24470 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
24480 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
24490 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
244a0 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
244b0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
244c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
244d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
244e0 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
244f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24500 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
24510 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24520 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
24530 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
24540 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
24550 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
24560 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
24570 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
24580 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
24590 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
245a0 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
245b0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
245c0 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
245d0 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
245e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
245f0 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
24600 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
24610 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
24620 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
24630 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
24640 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24650 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
24660 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
24670 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
24680 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
24690 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
246a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
246b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
246c0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
246d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
246e0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
246f0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
24700 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
24710 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
24720 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
24730 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
24740 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
24750 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
24760 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
24770 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24790 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
247a0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
247b0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
247c0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
247d0 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
247e0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
247f0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
24800 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
24810 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
24820 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
24830 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
24840 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
24850 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
24860 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
24870 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
24880 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
24890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
248a0 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
248b0 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
248c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
248d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
248e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
248f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
24900 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24910 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24920 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24930 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
24940 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
24950 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
24960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24970 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24980 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
249a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
249b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
249c0 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
249d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
249e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
249f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
24a00 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
24a10 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
24a20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
24a30 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
24a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24a50 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
24a60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
24a70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
24a80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
24a90 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
24aa0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
24ab0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
24ac0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
24ad0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
24ae0 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
24af0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
24b00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
24b10 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
24b20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
24b30 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
24b40 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
24b50 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
24b60 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
24b70 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
24b80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
24b90 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
24ba0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
24bb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24bc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24bd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24be0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
24bf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24c00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
24c10 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
24c20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24c30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
24c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
24c50 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
24c60 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
24c70 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
24c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24c90 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
24ca0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
24cb0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
24cc0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
24cd0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
24ce0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
24cf0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
24d00 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
24d10 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
24d20 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
24d30 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
24d40 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
24d50 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
24d60 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
24d70 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
24d80 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
24d90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24da0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
24db0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
24dc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
24dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
24de0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
24df0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
24e00 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
24e10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
24e20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
24e30 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
24e40 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
24e50 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
24e60 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
24e70 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
24e80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
24e90 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
24ea0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
24eb0 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
24ec0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
24ed0 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
24ee0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
24ef0 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
24f00 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
24f10 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
24f20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
24f30 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
24f40 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
24f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24f60 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
24f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
24f90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
24fa0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
24fb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
24fc0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
24fd0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
24fe0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
24ff0 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
25000 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25010 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25020 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
25030 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25040 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
25050 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
25060 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
25070 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
25080 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
25090 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
250a0 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20  Pgno nPage;.    
250b0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
250c0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
250d0 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
250e0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
250f0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
25100 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
25110 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
25120 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
25130 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
25140 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25160 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
25170 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25180 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25190 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
251a0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
251b0 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
251c0 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
251d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
251e0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
251f0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
25210 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
25220 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
25230 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
25240 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
25250 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
25260 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
25270 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
25280 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
25290 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
252a0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
252b0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
252c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
252d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
252e0 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
252f0 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
25300 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
25310 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
25320 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
25330 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
25340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
25350 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
25360 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
25370 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
25380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
253a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
253b0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
253c0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
253d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
253e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
253f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25400 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
25410 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
25420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25430 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
25440 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
25450 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25460 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25470 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
25480 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
25490 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
254a0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
254b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
254c0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
254d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
254e0 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
254f0 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
25500 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
25510 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  le */.    int nP
25520 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
25530 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a  ount(pBt);.    *
25540 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20  pPgno = nPage + 
25550 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67  1;..    if( *pPg
25560 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
25570 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
25580 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
25590 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
255a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
255b0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
255c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
255d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
255e0 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
255f0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
25600 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
25610 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
25620 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
25630 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
25640 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
25650 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
25660 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
25670 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
25680 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
25690 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
256a0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
256b0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
256c0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
256d0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
256e0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
256f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
25700 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
25710 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
25720 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
25730 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
25740 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
25750 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
25760 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
25770 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25780 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
25790 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  gno, &pPg, 0);. 
257a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
257b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
257c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
257d0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
257e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
257f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
25800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25810 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
25820 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e  rc;.      (*pPgn
25830 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  o)++;.      if( 
25840 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
25850 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
25860 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a  { (*pPgno)++; }.
25870 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
25880 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
25890 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
258a0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
258b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
258c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
258d0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  Pgno, ppPage, 0)
258e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
258f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
25900 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25910 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
25920 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
25930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25940 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
25950 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
25960 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
25970 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
25980 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
25990 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
259a0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
259b0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
259c0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
259d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
259e0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
259f0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
25a00 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
25a10 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
25a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
25a30 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
25a40 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
25a50 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
25a60 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
25a70 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
25a80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25a90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25aa0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
25ab0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
25ac0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
25ad0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
25ae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25af0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25b00 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25b10 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
25b20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25b30 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
25b40 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
25b50 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
25b60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
25b70 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
25b80 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
25b90 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
25ba0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
25bb0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
25bc0 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
25bd0 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
25be0 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
25bf0 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
25c00 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
25c10 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
25c20 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
25c30 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
25c40 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
25c50 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
25c60 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
25c70 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
25c80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
25c90 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
25ca0 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
25cb0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
25cc0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
25cd0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
25ce0 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
25cf0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
25d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25d10 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
25d20 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
25d30 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
25d40 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
25d50 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d70 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
25d80 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
25d90 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
25dc0 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
25dd0 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
25de0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
25df0 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
25e00 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
25e10 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
25e20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25e30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
25e40 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
25e50 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
25e60 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
25e70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e90 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
25ea0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
25ed0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
25ee0 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
25ef0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
25f00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25f10 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
25f20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
25f30 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
25f40 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
25f50 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
25f60 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
25f70 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
25f80 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
25f90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
25fa0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
25fb0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
25fc0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
25fd0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
25fe0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
25ff0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
26000 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
26010 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
26020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26030 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
26040 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
26050 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
26060 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
26070 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
26080 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
26090 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
260a0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
260b0 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  e+1);..#ifdef SQ
260c0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
260d0 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
260e0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
260f0 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
26100 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
26110 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
26120 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
26130 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
26140 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
26150 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ros..  */.  if( 
26160 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d  (!pPage && (rc =
26170 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
26180 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
26190 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
261a0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
261b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
261c0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
261d0 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
261e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
261f0 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
26200 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
26210 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
26220 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
26230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
26240 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
26250 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
26260 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
26270 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
26280 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
26290 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
262a0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
262b0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
262c0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
262d0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
262e0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
262f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
26300 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
26310 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
26320 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
26330 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
26340 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
26350 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
26360 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
26370 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
26380 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
26390 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
263a0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
263b0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
263c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
263d0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
263e0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
263f0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
26400 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
26410 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
26420 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
26430 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
26440 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
26450 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
26460 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
26470 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
26480 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
26490 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
264a0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
264b0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
264c0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
264d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61   ){.    int nLea
264e0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
264f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
26500 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
26510 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
26520 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
26530 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
26540 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
26550 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
26560 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
26570 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
26580 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
265a0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
265b0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
265c0 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
265d0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
265e0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
265f0 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20  nLeaf<0 ){.     
26600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
26610 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
26620 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26630 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
26640 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61  ( nLeaf<pBt->usa
26650 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
26660 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
26670 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
26680 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
26690 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
266a0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
266b0 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
266c0 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
266d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
266e0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
266f0 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
26700 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
26710 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
26720 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
26730 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
26740 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
26750 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
26760 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
26770 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
26780 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
26790 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
267a0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
267b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
267c0 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
267d0 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
267e0 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
267f0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
26800 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
26810 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
26820 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
26830 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
26840 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
26850 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
26860 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
26870 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
26880 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
26890 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
268a0 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
268b0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
268c0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
268d0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
268e0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
268f0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
26900 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
26910 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
26920 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
26930 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
26940 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
26950 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
26960 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
26970 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
26980 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
26990 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
269a0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
269b0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
269c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
269d0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
269e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
269f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
26a10 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26a20 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
26a30 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
26a40 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
26a50 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
26a60 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
26a70 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
26a80 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28  LETE.        if(
26a90 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
26aa0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26ab0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
26ac0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26ad0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26ae0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
26af0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
26b00 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
26b10 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
26b20 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
26b30 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
26b40 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
26b50 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
26b60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
26b70 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
26b80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
26b90 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
26ba0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
26bb0 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
26bc0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
26bd0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
26be0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
26bf0 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
26c00 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
26c10 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
26c20 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
26c30 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
26c40 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
26c50 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
26c60 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
26c70 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
26c80 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
26c90 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
26ca0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
26cb0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
26cc0 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
26cd0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
26ce0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
26cf0 0a 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67  .  if(   ((!pPag
26d00 65 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  e) && (0 != (rc 
26d10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
26d20 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
26d30 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a  , &pPage, 0)))).
26d40 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72       || (0 != (r
26d50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26d60 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
26d70 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20  Page))).  ){.   
26d80 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26d90 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
26da0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
26db0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
26dc0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
26dd0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
26de0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
26df0 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
26e00 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
26e10 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
26e20 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
26e30 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
26e40 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
26e50 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
26e60 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
26e70 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
26e80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
26e90 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
26ea0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
26eb0 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
26ec0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
26ed0 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
26ee0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
26ef0 75 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50  urn freePage2(pP
26f00 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
26f10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d   pPage->pgno);.}
26f20 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
26f30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
26f40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26f50 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
26f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
26f70 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
26f80 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
26f90 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
26fa0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
26fb0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
26fc0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
26fd0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
26fe0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
26ff0 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c  Ovfl;.  u16 ovfl
27000 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
27010 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27020 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
27030 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
27040 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
27050 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
27060 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
27070 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
27080 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
27090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
270a0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
270b0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
270c0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
270d0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
270e0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
270f0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
27100 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
27110 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
27120 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
27130 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
27140 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
27150 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
27160 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
27170 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
27180 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
27190 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
271a0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
271b0 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
271c0 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
271d0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
271e0 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
271f0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
27200 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
27210 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  2 || ovflPgno>pa
27220 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
27230 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
27240 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
27250 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
27260 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
27270 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
27280 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
27290 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
272a0 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
272b0 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
272c0 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
272d0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
272e0 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
272f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27300 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
27310 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
27320 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
27330 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
27340 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
27350 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
27360 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
27370 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27380 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
27390 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
273a0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  flPgno);.    if(
273b0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
273c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
273d0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
273e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
273f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
27400 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
27410 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
27420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27430 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
27440 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
27450 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
27460 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
27470 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
27480 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
27490 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
274a0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
274b0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
274c0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
274d0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
274e0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
274f0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
27500 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
27510 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
27520 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
27530 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
27540 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
27550 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
27560 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
27570 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
27580 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
27590 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
275a0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
275b0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
275c0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
275d0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
275e0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
275f0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
27600 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
27610 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
27620 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
27630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27640 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
27650 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27670 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
27680 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
27690 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
276a0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
276b0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
276c0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
276d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
276e0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
276f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
27700 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
27710 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
27720 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
27730 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
27760 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
27770 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
27780 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
277a0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
277b0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
277c0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
277d0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
277e0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
277f0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
27800 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
27810 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
27820 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
27830 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
27840 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
27850 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
27860 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
27870 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
27880 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
27890 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
278a0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
278b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
278c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
278d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
278e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
278f0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
27900 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
27910 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
27920 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
27930 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
27940 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
27950 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
27960 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
27970 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
27980 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
27990 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
279a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
279b0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
279c0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
279d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
279e0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
279f0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
27a00 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
27a10 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
27a20 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
27a30 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
27a40 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
27a50 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
27a60 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
27a70 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
27a80 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
27a90 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
27aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
27ab0 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
27ac0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
27ad0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
27ae0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
27af0 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  )&nKey);.  sqlit
27b00 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
27b10 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
27b20 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
27b30 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
27b40 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
27b50 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
27b60 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
27b70 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
27b80 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
27b90 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
27ba0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
27bb0 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
27bc0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
27bd0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
27be0 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
27bf0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
27c00 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
27c10 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
27c20 73 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65  se{ .    if( nKe
27c30 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
27c40 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
27c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27c60 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
27c70 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
27c80 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
27c90 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
27ca0 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
27cb0 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
27cc0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
27cd0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
27ce0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
27cf0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
27d00 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
27d10 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
27d20 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
27d30 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
27d40 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
27d50 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
27d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27d70 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
27d80 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
27d90 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
27da0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
27db0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
27dc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
27dd0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
27de0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
27df0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
27e00 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
27e10 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
27e20 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
27e30 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
27e40 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
27e50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
27e60 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
27e70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
27e80 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
27e90 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
27ea0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
27eb0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
27ec0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27ed0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
27ee0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
27ef0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
27f00 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
27f10 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
27f20 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
27f30 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
27f40 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
27f50 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
27f60 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
27f70 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
27f80 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
27f90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
27fa0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
27fb0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
27fc0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
27fd0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
27fe0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
27ff0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
28000 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
28010 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
28020 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
28030 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
28040 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
28050 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
28060 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
28070 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
28080 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
28090 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
280a0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
280b0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
280c0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
280d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
280e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
280f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28100 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
28110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
28120 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
28130 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
28140 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
28150 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
28160 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
28170 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
28180 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29  ype, pgnoPtrmap)
28190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
281a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
281b0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
281c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
281d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
281e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
281f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
28200 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
28210 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28220 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
28230 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
28240 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
28250 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
28260 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
28270 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
28280 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
28290 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
282a0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
282b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
282c0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
282d0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
282e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
282f0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
28300 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
28310 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
28320 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
28330 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
28340 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
28350 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
28360 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
28370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28380 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
28390 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
283a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
283b0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
283c0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
283d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
283e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
283f0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
28400 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
28410 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
28420 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
28430 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
28440 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
28450 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
28460 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
28470 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
28480 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
28490 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
284a0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
284b0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
284c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
284d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
284e0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
284f0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
28500 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
28510 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
28520 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
28530 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
28540 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
28550 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
28560 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
28570 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
28580 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
28590 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
285a0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
285b0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
285c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
285d0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
285e0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
285f0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
28600 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
28610 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
28620 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
28630 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
28640 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
28650 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
28660 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
28670 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
28680 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
28690 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
286a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
286b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
286c0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
286d0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
286e0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
286f0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
28700 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
28710 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
28720 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
28730 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
28740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28750 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
28760 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
28770 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
28780 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
28790 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
287a0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
287b0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
287c0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
287d0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
287e0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
287f0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
28800 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
28810 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
28820 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
28830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28840 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
28850 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
28860 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
28870 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
28880 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
28890 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
288a0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
288b0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
288c0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
288d0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
288e0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
288f0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
28900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
28910 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
28920 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28930 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
28940 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
28950 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
28960 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
28970 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
28980 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65   int dropCell(Me
28990 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
289a0 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
289b0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
289c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
289d0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
289e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
289f0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
28a00 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
28a10 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
28a20 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
28a30 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
28a40 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
28a50 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
28a60 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
28a70 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
28a80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
28a90 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
28aa0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
28ab0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
28ac0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
28ad0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
28ae0 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
28af0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28b00 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28b10 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28b20 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
28b30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
28b40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
28b50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
28b60 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
28b70 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
28b80 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
28b90 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
28ba0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
28bb0 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70  tr);.  if( (pc<p
28bc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28bd0 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  6+(pPage->leaf?0
28be0 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63  :4)).     || (pc
28bf0 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  +sz>pPage->pBt->
28c00 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20  usableSize) ){. 
28c10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28c20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
28c30 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
28c40 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
28c50 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  z);.  if( rc!=SQ
28c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
28c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
28c80 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
28c90 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
28ca0 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
28cb0 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
28cc0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
28cd0 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
28ce0 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
28cf0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
28d00 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
28d10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
28d20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
28d30 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 2;.  return SQ
28d40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28d50 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
28d60 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
28d70 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
28d80 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
28d90 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
28da0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
28db0 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
28dc0 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
28dd0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
28de0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
28df0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
28e00 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
28e10 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
28e20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
28e30 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
28e40 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
28e50 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
28e60 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
28e70 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
28e80 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
28e90 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
28ea0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
28eb0 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
28ec0 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
28ed0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
28ee0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
28ef0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
28f00 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
28f10 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
28f20 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
28f30 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
28f40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
28f50 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
28f60 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
28f70 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
28f80 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
28f90 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
28fa0 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
28fb0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
28fc0 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
28fd0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
28fe0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
28ff0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
29000 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
29010 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
29020 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
29030 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
29040 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
29050 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
29060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29070 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
29080 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
29090 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
290a0 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
290b0 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
290c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
290d0 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
290e0 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
290f0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
29100 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
29110 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
29120 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
29130 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
29140 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
29150 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
29160 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
29170 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
29180 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
29190 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
291a0 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 20  /.  Pgno iChild 
291b0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
291c0 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
291d0 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
291e0 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 29   this value */.)
291f0 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
29200 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
29210 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
29220 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
29230 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
29240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
29250 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
29260 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
29270 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
29280 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
29290 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
292a0 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
292b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
292c0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
292d0 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
292e0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
292f0 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
29300 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
29310 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
29320 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
29330 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
29340 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
29350 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
29360 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
29370 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
29380 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
29390 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
293a0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
293b0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
293c0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
293d0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
293e0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
293f0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
29400 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
29410 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
29420 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
29430 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69  n data[] */..  i
29440 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
29450 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
29460 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
29470 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
29480 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
294a0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
294b0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
294c0 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
294d0 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a  ->pBt)<=5460 );.
294e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
294f0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
29500 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
29510 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
29520 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
29530 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29  (pPage, pCell) )
29540 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29560 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
29570 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
29580 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
29590 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
295a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
295b0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
295c0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
295d0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
295e0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
295f0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
29600 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
29610 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
29620 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
29630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
29640 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29650 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
29660 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
29670 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
29680 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
29690 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
296a0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
296b0 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
296c0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
296d0 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
296e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
296f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29700 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
29710 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
29720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29750 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
29760 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
29770 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
29780 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
29790 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
297a0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
297b0 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
297c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
297d0 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
297e0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
297f0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
29800 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
29810 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
29820 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
29830 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
29840 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
29850 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
29860 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
29870 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
29880 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
298a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
298b0 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67   }.      top = g
298c0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
298d0 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
298e0 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
298f0 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
29900 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
29910 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
29920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
29930 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
29940 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
29950 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
29960 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b   );.    if (idx+
29970 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
29980 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20  >usableSize) {. 
29990 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
299a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
299b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
299c0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
299d0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
299e0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 75 31  age->nFree - (u1
299f0 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
29a00 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
29a10 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
29a20 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
29a30 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
29a40 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
29a50 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
29a60 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
29a70 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74   for(j=end-2, pt
29a80 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
29a90 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
29aa0 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
29ab0 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
29ac0 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
29ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
29ae0 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
29af0 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
29b00 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
29b10 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
29b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29b30 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29b40 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
29b50 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
29b60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
29b70 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
29b80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
29b90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
29ba0 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
29bb0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
29bc0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
29bd0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
29be0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
29bf0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
29c00 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
29c10 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
29c20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29c30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
29c40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29c50 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
29c60 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
29c70 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
29c80 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
29c90 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
29ca0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
29cb0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
29cc0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
29cd0 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
29ce0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29cf0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
29d00 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
29d10 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
29d20 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
29d30 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
29d40 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
29d50 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
29d60 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
29d70 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
29d80 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
29d90 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
29da0 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
29db0 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
29dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29dd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
29de0 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20    u8 *pCellptr; 
29df0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
29e00 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
29e10 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
29e20 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
29e30 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
29e40 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
29e50 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
29e60 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
29e70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
29e80 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
29e90 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
29ea0 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
29eb0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
29ec0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
29ed0 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
29ee0 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
29ef0 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61  nt nUsable = pPa
29f00 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
29f10 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
29f20 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a  ize of page */..
29f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29f40 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
29f50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29f60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
29f70 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
29f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
29f90 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
29fa0 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
29fb0 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
29fc0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
29fd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
29fe0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29ff0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2a000 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2a010 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2a020 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
2a030 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
2a040 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
2a050 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2a060 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a070 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2a080 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65  hdr+5])==nUsable
2a090 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20   );..  pCellptr 
2a0a0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2a0b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
2a0c0 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
2a0d0 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
2a0e0 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
2a0f0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65  0; i--){.    pCe
2a100 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2a110 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a  cellbody -= aSiz
2a120 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  e[i];.    put2by
2a130 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2a140 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2a150 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2a160 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
2a170 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Size[i]);.  }.  
2a180 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2a190 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
2a1a0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2a1b0 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
2a1c0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2a1d0 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
2a1e0 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
2a1f0 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
2a200 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
2a210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2a220 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
2a230 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
2a240 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
2a250 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
2a260 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
2a270 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2a280 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
2a290 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2a2a0 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
2a2b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2a2c0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
2a2d0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
2a2e0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
2a2f0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
2a300 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
2a310 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
2a320 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
2a330 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
2a340 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
2a350 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
2a360 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
2a370 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
2a380 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
2a390 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
2a3a0 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
2a3b0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
2a3c0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
2a3d0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
2a3e0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
2a3f0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
2a400 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
2a410 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
2a420 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
2a430 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
2a440 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
2a450 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
2a460 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
2a470 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
2a480 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
2a490 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a4a0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2a4b0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2a4c0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
2a4d0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
2a4e0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
2a4f0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
2a500 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
2a510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2a520 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
2a530 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
2a540 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
2a550 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
2a560 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2a570 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
2a580 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
2a590 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
2a5a0 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
2a5b0 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
2a5c0 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
2a5d0 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
2a5e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
2a5f0 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
2a600 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
2a610 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
2a620 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
2a630 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2a640 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2a650 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2a660 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2a670 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2a680 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2a690 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2a6a0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2a6b0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2a6c0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2a6d0 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2a6e0 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2a6f0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2a700 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2a710 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2a720 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2a730 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2a740 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2a750 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2a760 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2a770 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2a780 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2a790 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2a7a0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2a7b0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2a7c0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2a7d0 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2a7e0 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2a7f0 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2a800 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2a810 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2a820 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2a830 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2a840 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2a850 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2a860 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2a870 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2a880 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2a890 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2a8a0 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2a8b0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2a8c0 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2a8d0 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2a8e0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2a8f0 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2a900 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2a910 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2a920 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2a930 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2a940 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2a950 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2a960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2a970 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2a980 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2a990 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2a9a0 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2a9b0 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2a9c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2a9d0 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2a9e0 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2a9f0 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa10 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2aa20 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2aa30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2aa60 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2aa70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2aa90 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2aaa0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2aab0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2aac0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2aad0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2aae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2aaf0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2ab00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2ab10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ab20 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2ab30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
2ab40 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll<=0 ) return S
2ab50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ab60 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
2ab70 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
2ab80 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2ab90 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
2aba0 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
2abb0 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
2abc0 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
2abd0 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
2abe0 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2abf0 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
2ac00 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
2ac10 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
2ac20 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
2ac30 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
2ac40 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2ac50 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2ac60 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
2ac70 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
2ac80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
2ac90 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
2aca0 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
2acb0 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
2acc0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
2acd0 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
2ace0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2acf0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2ad00 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
2ad10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ad20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ad30 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
2ad40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ad50 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
2ad60 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2ad70 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2ad80 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
2ad90 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
2ada0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2adb0 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
2adc0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
2add0 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
2ade0 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
2adf0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2ae00 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2ae10 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2ae20 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
2ae30 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
2ae40 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
2ae50 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
2ae60 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
2ae70 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
2ae80 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
2ae90 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
2aea0 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
2aeb0 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
2aec0 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
2aed0 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
2aee0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
2aef0 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
2af00 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
2af10 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
2af20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
2af30 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
2af40 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
2af50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2af60 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2af70 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
2af80 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
2af90 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
2afa0 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
2afb0 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
2afc0 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
2afd0 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
2afe0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2aff0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2b000 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b010 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b020 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2b030 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2b040 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2b050 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2b060 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
2b070 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2b080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b090 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2b0a0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a  r(pNew, pCell);.
2b0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b0c0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2b0d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2b0e0 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2b0f0 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2b100 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2b110 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2b120 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2b130 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2b140 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2b150 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2b160 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2b170 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2b180 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2b190 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2b1a0 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2b1b0 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2b1c0 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2b1d0 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2b1e0 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2b1f0 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2b200 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2b210 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2b220 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2b230 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2b240 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2b250 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2b260 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2b270 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2b280 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2b290 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2b2a0 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2b2b0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2b2c0 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2b2d0 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2b2e0 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2b2f0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2b300 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2b310 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2b320 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2b330 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2b340 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2b350 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2b360 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2b370 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2b380 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2b390 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2b3a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b3b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2b3c0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2b3d0 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2b3e0 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2b3f0 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2b400 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2b410 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2b420 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2b430 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2b440 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2b450 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2b460 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2b470 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2b480 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2b490 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2b4a0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2b4b0 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  nt,pParent->nCel
2b4c0 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70  l,pSpace,(int)(p
2b4d0 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50  Out-pSpace),0,pP
2b4e0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  age->pgno);..   
2b4f0 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2b500 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2b510 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2b520 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2b530 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2b540 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2b550 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2b560 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2b570 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2b580 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2b590 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2b5a0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2b5b0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2b5c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b5d0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2b5e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2b5f0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2b600 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2b610 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2b620 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2b630 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2b640 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2b650 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2b660 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2b670 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2b680 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2b690 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2b6a0 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2b6b0 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2b6c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2b6d0 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2b6e0 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2b6f0 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2b700 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2b710 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2b720 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2b730 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2b740 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2b750 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2b760 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2b770 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2b780 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2b790 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2b7a0 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2b7b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2b7c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2b7d0 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2b7e0 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2b7f0 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2b800 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b810 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2b820 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
2b830 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
2b840 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
2b850 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
2b860 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
2b870 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
2b880 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2b890 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
2b8a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2b8b0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2b8c0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
2b8d0 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
2b8e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2b8f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b900 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2b910 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
2b920 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2b930 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
2b940 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
2b950 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2b960 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2b970 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
2b980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2b990 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2b9a0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
2b9b0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
2b9c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b9d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2b9e0 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
2b9f0 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
2ba00 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
2ba10 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2ba20 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2ba30 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
2ba40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2ba50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2ba60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ba70 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
2ba80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2ba90 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
2baa0 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
2bab0 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
2bac0 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
2bad0 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
2bae0 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
2baf0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2bb00 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
2bb10 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
2bb20 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
2bb30 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
2bb40 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
2bb50 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
2bb60 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
2bb70 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
2bb80 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
2bb90 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2bba0 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
2bbb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
2bbc0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
2bbd0 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
2bbe0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2bbf0 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2bc00 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
2bc10 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
2bc20 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
2bc30 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
2bc40 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
2bc50 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76  e.** MemPage.aOv
2bc60 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65  fl[] array), the
2bc70 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64  y are not copied
2bc80 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20   to pTo. .**.** 
2bc90 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
2bca0 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65  , page pTo is re
2bcb0 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e  initialized usin
2bcc0 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  g sqlite3BtreeIn
2bcd0 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
2bce0 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
2bcf0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2bd00 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
2bd10 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
2bd20 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
2bd30 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
2bd40 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
2bd50 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
2bd60 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
2bd70 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
2bd80 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
2bd90 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
2bda0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bdb0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2bdc0 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
2bdd0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a   MemPage *pTo){.
2bde0 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
2bdf0 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
2be00 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  pBt;.  u8 * cons
2be10 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
2be20 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63  >aData;.  u8 * c
2be30 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
2be40 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e  aData;.  int con
2be50 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
2be60 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
2be70 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
2be80 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
2be90 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
2bea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2beb0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61  TE_OK;.  int iDa
2bec0 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
2bed0 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
2bee0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2bef0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
2bf00 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32  ;.  assert( get2
2bf10 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2bf20 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75  mHdr+5])<=pBt->u
2bf30 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20  sableSize );..  
2bf40 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
2bf50 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
2bf60 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
2bf70 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
2bf80 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2bf90 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2bfa0 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
2bfb0 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
2bfc0 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
2bfd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
2bfe0 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  ta);.  memcpy(&a
2bff0 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72  To[iToHdr], &aFr
2c000 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46  om[iFromHdr], pF
2c010 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  rom->cellOffset 
2c020 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c  + 2*pFrom->nCell
2c030 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69  );..  /* Reiniti
2c040 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
2c050 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
2c060 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
2c070 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  ge structure.  *
2c080 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
2c090 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
2c0a0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
2c0b0 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61  "cannot" fail, a
2c0c0 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20  s the.  ** data 
2c0d0 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f  copied from pFro
2c0e0 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  m is known to be
2c0f0 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54   valid.  */.  pT
2c100 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2c110 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29   TESTONLY(rc = )
2c120 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2c130 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73  tPage(pTo);.  as
2c140 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2c150 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  _OK );..  /* If 
2c160 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2c170 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2c180 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2c190 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a  ter-map entries.
2c1a0 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
2c1b0 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
2c1c0 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
2c1d0 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
2c1e0 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a  pointers to. */.
2c1f0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2c200 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  UM ){.    rc = s
2c210 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
2c220 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  To);.  }.  retur
2c230 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2c240 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
2c250 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
2c260 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
2c270 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
2c280 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
2c290 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
2c2a0 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
2c2b0 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
2c2c0 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
2c2d0 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
2c2e0 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
2c2f0 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
2c300 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
2c310 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
2c320 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
2c330 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
2c340 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
2c350 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
2c360 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
2c370 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
2c380 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
2c390 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
2c3a0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
2c3b0 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
2c3c0 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
2c3d0 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
2c3e0 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
2c3f0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
2c400 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
2c410 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
2c420 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
2c430 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
2c440 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
2c450 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2c460 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
2c470 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
2c480 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
2c490 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
2c4a0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
2c4b0 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
2c4c0 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
2c4d0 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
2c4e0 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
2c4f0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
2c500 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
2c510 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
2c520 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
2c530 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
2c540 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
2c550 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
2c560 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
2c570 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
2c580 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
2c590 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
2c5a0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
2c5b0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
2c5c0 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c  res that all cel
2c5d0 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ls allocated.** 
2c5e0 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
2c5f0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74  its siblings fit
2c600 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44   into MemPage.aD
2c610 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74  ata[] before ret
2c620 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  urning..**.** In
2c630 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
2c640 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67  alancing the pag
2c650 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2c660 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65  gs, cells may be
2c670 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
2c680 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
2c690 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2c6a0 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69  e (pParent). Doi
2c6b0 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75  ng so.** may cau
2c6c0 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  se the parent pa
2c6d0 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  ge to become ove
2c6e0 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
2c6f0 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68  ll. If this.** h
2c700 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68  appens, it is th
2c710 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2c720 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
2c730 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72  o invoke the cor
2c740 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e  rect.** balancin
2c750 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78  g routine to fix
2c760 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73   this problem (s
2c770 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  ee the balance()
2c780 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a   routine). .**.*
2c790 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
2c7a0 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
2c7b0 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
2c7c0 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
2c7d0 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
2c7e0 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20  upted state. So 
2c7f0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2c800 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
2c810 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
2c820 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
2c830 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
2c840 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2c850 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70  unction, aOvflSp
2c860 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  ace, is a pointe
2c870 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72  r to a.** buffer
2c880 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73   page-size bytes
2c890 20 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e   in size. If, in
2c8a0 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
2c8b0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2c8c0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
2c8d0 74 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70  t), the parent p
2c8e0 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
2c8f0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
2c900 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
2c910 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
2c920 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
2c930 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
2c940 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
2c950 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
2c960 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
2c970 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2c980 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
2c990 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
2c9a0 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
2c9b0 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
2c9c0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
2c9d0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
2c9e0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
2c9f0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
2ca00 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
2ca10 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2ca20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
2ca30 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
2ca40 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
2ca50 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
2ca60 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
2ca70 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2ca80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
2ca90 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
2caa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2cab0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
2cac0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2cad0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
2cae0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2caf0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
2cb00 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2cb10 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
2cb40 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
2cb50 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
2cb60 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
2cb70 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
2cb80 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
2cb90 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
2cba0 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
2cbb0 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
2cbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cbd0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
2cbe0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b   root-page */.){
2cbf0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2cc00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cc10 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
2cc20 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
2cc30 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2cc40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cc50 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
2cc60 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2cc70 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
2cc80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2cc90 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
2cca0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
2ccb0 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
2ccc0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
2ccd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cce0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
2ccf0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
2cd00 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2cd10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cd20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
2cd30 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
2cd40 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
2cd50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2cd60 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2cd70 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
2cd80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2cd90 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
2cda0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
2cdb0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
2cdc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2cdd0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2cde0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
2cdf0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2ce00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
2ce10 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2ce20 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
2ce30 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ce50 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
2ce60 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
2ce70 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
2ce80 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
2ce90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2cea0 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
2ceb0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
2cec0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
2ced0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2cee0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2cef0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2cf00 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
2cf10 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2cf20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
2cf30 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
2cf40 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
2cf50 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
2cf60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2cf70 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2cf80 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
2cf90 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
2cfa0 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
2cfb0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
2cfc0 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
2cfd0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
2cfe0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
2cff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2d000 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
2d010 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
2d020 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
2d030 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
2d040 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
2d050 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
2d060 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2d070 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
2d080 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
2d090 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
2d0a0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
2d0b0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
2d0c0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2d0d0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
2d0e0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
2d0f0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
2d100 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
2d110 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
2d120 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
2d130 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
2d140 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
2d150 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
2d160 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
2d170 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
2d180 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
2d190 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
2d1a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2d1b0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
2d1c0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
2d1d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
2d1e0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2d1f0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
2d200 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
2d210 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
2d220 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2d230 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2d240 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2d250 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
2d260 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2d270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d280 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2d290 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
2d2a0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
2d2b0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
2d2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
2d2d0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
2d2e0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
2d2f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
2d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d310 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
2d320 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
2d330 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
2d340 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
2d350 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2d360 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d370 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2d380 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d390 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2d3a0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2d3b0 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
2d3c0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2d3d0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
2d3e0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
2d3f0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
2d400 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
2d410 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
2d420 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
2d430 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
2d440 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
2d450 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
2d460 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
2d470 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
2d480 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
2d490 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
2d4a0 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
2d4b0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
2d4c0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
2d4d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
2d4e0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
2d4f0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
2d500 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2d510 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2d520 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2d530 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
2d540 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2d550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2d560 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2d570 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f  0 || pParent->aO
2d580 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72  vfl[0].idx==iPar
2d590 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28  entIdx );..  if(
2d5a0 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a   !aOvflSpace ){.
2d5b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d5c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2d5d0 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c  /* Find the sibl
2d5e0 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c  ing pages to bal
2d5f0 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74  ance. Also locat
2d600 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  e the cells in p
2d610 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61  Parent .  ** tha
2d620 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62  t divide the sib
2d630 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70  lings. An attemp
2d640 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
2d650 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
2d660 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69   .  ** either si
2d670 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72  de of pPage. Mor
2d680 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
2d690 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
2d6a0 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20  de, however, .  
2d6b0 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ** if there are 
2d6c0 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
2d6d0 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
2d6e0 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61  her side. If pPa
2d6f0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
2d700 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
2d710 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
2d720 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
2d730 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a  are taken.  .  *
2d740 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2d750 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20   also drops the 
2d760 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
2d770 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2d780 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61  ge. This.  ** wa
2d790 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  y, the remainder
2d7a0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
2d7b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
2d7c0 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a  o deal with any.
2d7d0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65    ** overflow ce
2d7e0 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  lls in the paren
2d7f0 74 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e  t page, as if on
2d800 65 20 65 78 69 73 74 65 64 20 69 74 20 68 61 73  e existed it has
2d810 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
2d820 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a  en removed.  */.
2d830 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
2d840 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
2d850 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
2d860 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
2d870 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
2d880 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
2d890 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
2d8a0 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
2d8b0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
2d8c0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
2d8d0 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
2d8e0 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
2d8f0 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
2d900 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
2d910 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
2d920 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
2d930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
2d940 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
2d950 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2d960 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
2d970 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2d980 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
2d990 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2d9a0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
2d9b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
2d9c0 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
2d9d0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
2d9e0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2d9f0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
2da00 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
2da10 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
2da20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
2da30 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2da40 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
2da50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2da60 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
2da70 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28  ld, 0, i*sizeof(
2da80 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
2da90 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2daa0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
2dab0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
2dac0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
2dad0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
2dae0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69  flow;.    if( (i
2daf0 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  --)==0 ) break;.
2db00 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74  .    if( pParent
2db10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69  ->nOverflow && i
2db20 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d  +nxDiv==pParent-
2db30 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b  >aOvfl[0].idx ){
2db40 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2db50 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  = pParent->aOvfl
2db60 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  [0].pCell;.     
2db70 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2db80 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
2db90 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
2dba0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2dbb0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
2dbc0 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
2dbd0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
2dbe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
2dbf0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
2dc00 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
2dc10 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2dc20 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
2dc30 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2dc40 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
2dc50 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
2dc60 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2dc70 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
2dc80 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
2dc90 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2dca0 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
2dcb0 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
2dcc0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
2dcd0 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
2dce0 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
2dcf0 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
2dd00 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
2dd10 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
2dd20 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
2dd30 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
2dd40 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
2dd50 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
2dd60 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
2dd70 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2dd80 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
2dd90 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
2dda0 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
2ddb0 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
2ddc0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
2ddd0 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
2dde0 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
2ddf0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2de00 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73  Unless SQLite is
2de10 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63   compiled in sec
2de20 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e  ure-delete mode.
2de30 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20   In this case,. 
2de40 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
2de50 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
2de60 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
2de70 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
2de80 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
2de90 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2dea0 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
2deb0 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
2dec0 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
2ded0 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
2dee0 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
2def0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
2df00 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
2df10 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
2df20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
2df30 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20  ted.  */.#ifdef 
2df40 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
2df50 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70  LETE.      memcp
2df60 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  y(&aOvflSpace[ap
2df70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
2df80 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d  aData], apDiv[i]
2df90 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
2dfa0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61     apDiv[i] = &a
2dfb0 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
2dfc0 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
2dfd0 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  a];.#endif.     
2dfe0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
2dff0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2e000 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73  nt->nOverflow, s
2e010 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zNew[i]);.    }.
2e020 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
2e030 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
2e040 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
2e050 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
2e060 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
2e070 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
2e080 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
2e090 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
2e0a0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
2e0b0 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
2e0c0 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
2e0d0 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  k = pBt->pageSiz
2e0e0 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e + ROUND8(sizeo
2e0f0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73  f(MemPage));.  s
2e100 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
2e110 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
2e120 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
2e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e140 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
2e150 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
2e160 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e180 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
2e190 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e1c0 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
2e1d0 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20   + k*nOld;      
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e200 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61  * Page copies (a
2e210 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65  pCopy) */.  apCe
2e220 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
2e230 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
2e240 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
2e250 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
2e260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e270 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
2e280 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2e290 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2e2a0 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
2e2b0 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20  lls];.  aSpace1 
2e2c0 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
2e2d0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
2e2e0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2e2f0 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65  ALIGNMENT(aSpace
2e300 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  1) );..  /*.  **
2e310 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
2e320 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
2e330 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
2e340 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2e350 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
2e360 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
2e370 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
2e380 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
2e390 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2e3a0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
2e3b0 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d  d from aSpace1[]
2e3c0 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
2e3d0 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
2e3e0 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
2e3f0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
2e400 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
2e410 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
2e420 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
2e430 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
2e440 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
2e450 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
2e460 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
2e470 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
2e480 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
2e490 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
2e4a0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
2e4b0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2e4c0 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
2e4d0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
2e4e0 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
2e4f0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
2e500 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
2e510 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
2e520 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
2e530 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
2e540 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
2e550 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
2e560 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
2e570 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
2e580 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
2e590 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
2e5a0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
2e5b0 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
2e5c0 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
2e5d0 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
2e5e0 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
2e5f0 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
2e600 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
2e610 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
2e620 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
2e630 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
2e640 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
2e650 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2e660 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
2e670 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
2e680 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
2e690 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
2e6a0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
2e6b0 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
2e6c0 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
2e6d0 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
2e6e0 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
2e6f0 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
2e700 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
2e710 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
2e720 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
2e730 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
2e740 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
2e750 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
2e760 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
2e770 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
2e780 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
2e790 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
2e7a0 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
2e7b0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
2e7c0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
2e7d0 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
2e7e0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2e7f0 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
2e800 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
2e810 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
2e820 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
2e830 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
2e840 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
2e850 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
2e860 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
2e870 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
2e880 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
2e890 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2e8a0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
2e8b0 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
2e8c0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
2e8d0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
2e8e0 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
2e8f0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
2e900 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
2e910 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
2e920 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
2e930 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
2e940 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
2e950 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
2e960 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
2e970 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
2e980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2e990 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2e9a0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2e9b0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
2e9c0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2e9d0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
2e9e0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
2e9f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2ea00 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2ea10 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
2ea20 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
2ea30 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
2ea40 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2ea50 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
2ea60 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2ea70 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
2ea80 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2ea90 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2eaa0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
2eab0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2eac0 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
2ead0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
2eae0 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
2eaf0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2eb00 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
2eb10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2eb20 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2eb30 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
2eb40 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
2eb50 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
2eb60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
2eb70 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
2eb80 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
2eb90 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
2eba0 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
2ebb0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
2ebc0 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
2ebd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
2ebe0 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
2ebf0 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
2ec00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ec10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2ec20 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
2ec30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2ec40 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
2ec50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
2ec60 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
2ec70 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
2ec80 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
2ec90 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
2eca0 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
2ecb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ecc0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
2ecd0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
2ece0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
2ecf0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2ed00 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
2ed10 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
2ed20 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
2ed30 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
2ed40 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
2ed50 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
2ed60 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
2ed70 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2ed80 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
2ed90 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
2eda0 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
2edb0 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
2edc0 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
2edd0 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
2ede0 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
2edf0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
2ee00 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
2ee10 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
2ee20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
2ee30 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
2ee40 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
2ee50 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
2ee60 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
2ee70 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
2ee80 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
2ee90 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
2eea0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
2eeb0 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
2eec0 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
2eed0 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
2eee0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
2eef0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
2ef00 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
2ef10 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
2ef20 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
2ef30 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
2ef40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2ef50 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
2ef60 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
2ef70 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
2ef80 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
2ef90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2efa0 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
2efb0 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
2efc0 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
2efd0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
2efe0 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
2eff0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
2f000 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
2f010 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
2f020 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
2f030 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
2f040 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
2f050 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
2f060 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
2f070 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
2f080 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
2f090 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
2f0a0 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
2f0b0 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
2f0c0 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
2f0d0 52 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  RRUPT; goto bala
2f0e0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
2f0f0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
2f100 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
2f110 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
2f120 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
2f130 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
2f140 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
2f150 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
2f160 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
2f170 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
2f180 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
2f190 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
2f1a0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
2f1b0 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
2f1c0 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
2f1d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
2f1e0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
2f1f0 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
2f200 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
2f210 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
2f220 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
2f230 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
2f240 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
2f250 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
2f260 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
2f270 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
2f280 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2f290 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
2f2a0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
2f2b0 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
2f2c0 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
2f2d0 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
2f2e0 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
2f2f0 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
2f300 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
2f310 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2f320 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
2f330 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
2f340 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
2f350 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2f360 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
2f370 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
2f380 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
2f390 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
2f3a0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
2f3b0 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
2f3c0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
2f3d0 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
2f3e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2f3f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
2f400 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
2f410 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
2f420 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
2f430 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f440 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
2f450 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
2f460 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
2f470 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
2f480 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
2f490 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
2f4a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
2f4b0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2f4c0 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
2f4d0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
2f4e0 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
2f4f0 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
2f500 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
2f510 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
2f520 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
2f530 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
2f540 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
2f550 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
2f560 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
2f570 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
2f580 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
2f590 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
2f5a0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
2f5b0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
2f5c0 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
2f5d0 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
2f5e0 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
2f5f0 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
2f600 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
2f610 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
2f620 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
2f630 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
2f640 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
2f650 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
2f660 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
2f670 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
2f680 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
2f690 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
2f6a0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
2f6b0 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
2f6c0 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
2f6d0 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
2f6e0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
2f6f0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
2f700 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
2f710 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
2f720 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
2f730 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
2f740 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
2f750 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
2f760 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
2f770 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
2f780 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
2f790 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
2f7a0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
2f7b0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
2f7c0 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
2f7d0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
2f7e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2f7f0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2f800 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2f810 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c  pageFlags = apOl
2f820 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  d[0]->aData[0];.
2f830 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
2f840 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
2f850 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
2f860 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
2f870 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
2f880 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
2f890 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
2f8a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f8b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2f8c0 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
2f8d0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
2f8e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2f8f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2f900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f910 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
2f920 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2f930 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2f940 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c  t, &pNew, &pgno,
2f950 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20   pgno, 0);.     
2f960 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2f970 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2f980 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
2f990 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
2f9a0 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
2f9b0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
2f9c0 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
2f9d0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
2f9e0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
2f9f0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2fa00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2fa10 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
2fa20 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
2fa30 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
2fa40 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2fa50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fa60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2fa70 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2fa80 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2fa90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2faa0 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
2fab0 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
2fac0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
2fad0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
2fae0 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
2faf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2fb00 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2fb10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2fb20 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2fb30 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
2fb40 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2fb50 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2fb60 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
2fb70 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
2fb80 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
2fb90 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
2fba0 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
2fbb0 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
2fbc0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
2fbd0 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
2fbe0 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
2fbf0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
2fc00 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
2fc10 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
2fc20 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
2fc30 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
2fc40 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
2fc50 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
2fc60 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
2fc70 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
2fc80 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
2fc90 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
2fca0 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
2fcb0 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
2fcc0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
2fcd0 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
2fce0 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
2fcf0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
2fd00 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
2fd10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2fd20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
2fd30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
2fd40 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
2fd50 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
2fd60 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
2fd70 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
2fd80 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
2fd90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
2fda0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
2fdb0 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
2fdc0 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
2fdd0 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
2fde0 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
2fdf0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
2fe00 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
2fe10 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
2fe20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
2fe30 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
2fe40 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
2fe50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2fe60 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
2fe70 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
2fe80 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
2fe90 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d      t = apNew[i]
2fea0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54  ->pgno;.      pT
2feb0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
2fec0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
2fed0 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
2fee0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
2fef0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
2ff00 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25  RACE(("new: %d(%
2ff10 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
2ff20 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
2ff30 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d  ",.    apNew[0]-
2ff40 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c  >pgno, szNew[0],
2ff50 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61  .    nNew>=2 ? a
2ff60 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[1]->pgno : 
2ff70 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
2ff80 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
2ff90 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32  New>=3 ? apNew[2
2ffa0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
2ffb0 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
2ffc0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
2ffd0 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e   ? apNew[3]->pgn
2ffe0 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  o : 0, nNew>=4 ?
2fff0 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
30000 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e     nNew>=5 ? apN
30010 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[4]->pgno : 0,
30020 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
30030 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73  [4] : 0));..  as
30040 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30050 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30060 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
30070 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52  );.  put4byte(pR
30080 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  ight, apNew[nNew
30090 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  -1]->pgno);..  /
300a0 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
300b0 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
300c0 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
300d0 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
300e0 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
300f0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
30100 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
30110 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
30120 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
30130 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
30140 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
30150 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
30160 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
30170 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
30180 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
30190 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
301a0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
301b0 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
301c0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
301d0 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
301e0 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
301f0 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
30200 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
30210 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
30220 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
30230 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
30240 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
30250 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a  low==0 );..    j
30260 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
30270 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
30280 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
30290 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
302a0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
302b0 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
302c0 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
302d0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
302e0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
302f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30300 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e  i<nNew-1 || j==n
30310 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
30320 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
30330 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
30340 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
30350 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
30360 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
30370 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
30380 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
30390 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
303a0 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
303b0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70  rection;.      p
303c0 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61  Temp = &aOvflSpa
303d0 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a  ce[iOvflSpace];.
303e0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
303f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
30400 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
30410 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
30420 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  4);.      }else 
30430 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
30440 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
30450 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66  e tree is a leaf
30460 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20  -data tree, and 
30470 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
30480 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20   leaves, .      
30490 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
304a0 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65  is no divider ce
304b0 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20  ll in apCell[]. 
304c0 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76  Instead, the div
304d0 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ider .        **
304e0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
304f0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
30500 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  y for the right-
30510 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20  most cell of .  
30520 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62        ** the sib
30530 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62  ling-page assemb
30540 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a  led above only..
30550 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30560 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
30570 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
30580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
30590 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
305a0 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c  pNew, apCell[j],
305b0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
305c0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
305d0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b          sz = 4 +
305e0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
305f0 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29  l[4], info.nKey)
30600 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
30610 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
30620 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
30630 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a  -= 4;.        /*
30640 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f   Obscure case fo
30650 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20  r non-leaf-data 
30660 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65  trees: If the ce
30670 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a  ll at pCell was.
30680 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
30690 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20  ously stored on 
306a0 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64  a leaf node, and
306b0 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69   its reported si
306c0 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20  ze was 4.       
306d0 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20   ** bytes, then 
306e0 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  it may actually 
306f0 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
30700 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  this .        **
30710 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72   (see sqlite3Btr
30720 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
30730 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
30740 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
30750 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
30760 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
30770 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
30780 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
30790 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
307a0 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
307b0 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
307c0 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
307d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
307e0 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
307f0 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
30800 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
30810 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
30820 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
30830 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
30840 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
30850 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
30860 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
30870 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
30880 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
30890 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
308a0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
308b0 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
308c0 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
308d0 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
308e0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
308f0 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
30900 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
30910 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
30920 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30930 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
30940 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
30950 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
30960 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
30970 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70   assert( iOvflSp
30980 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
30990 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
309a0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
309b0 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
309c0 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
309d0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
309e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
309f0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
30a00 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
30a10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30a20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
30a30 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
30a40 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
30a50 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
30a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
30a70 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
30a80 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
30a90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
30aa0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
30ab0 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
30ac0 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
30ad0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
30ae0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
30af0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
30b00 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
30b10 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
30b20 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
30b30 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
30b40 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
30b50 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
30b60 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
30b70 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
30b80 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
30b90 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
30ba0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
30bb0 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
30bc0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
30bd0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
30be0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
30bf0 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
30c00 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
30c10 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
30c20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
30c30 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
30c40 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
30c50 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
30c60 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
30c70 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
30c80 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
30c90 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
30ca0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
30cb0 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
30cc0 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
30cd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
30ce0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
30cf0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
30d00 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
30d10 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
30d20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
30d30 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
30d40 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
30d50 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
30d60 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
30d70 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
30d80 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
30d90 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
30da0 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
30db0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
30dc0 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
30dd0 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
30de0 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
30df0 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
30e00 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
30e10 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
30e20 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
30e30 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
30e40 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
30e50 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
30e60 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
30e70 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
30e80 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
30e90 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
30ea0 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
30eb0 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
30ec0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
30ed0 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
30ee0 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
30ef0 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
30f00 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
30f10 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
30f20 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
30f30 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
30f40 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
30f50 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f  (rc = copyNodeCo
30f60 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
30f70 70 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20  pParent)) ){.   
30f80 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
30f90 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20  (apNew[0]);.    
30fa0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  }.  }else if( IS
30fb0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
30fc0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
30fd0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
30fe0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
30ff0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
31000 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
31010 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
31020 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
31030 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
31040 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
31050 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
31060 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
31070 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
31080 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
31090 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
310a0 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
310b0 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
310c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
310d0 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
310e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
310f0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
31100 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
31110 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
31120 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
31130 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
31140 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
31150 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
31160 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
31170 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
31180 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
31190 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
311a0 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
311b0 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
311c0 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
311d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
311e0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
311f0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
31200 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
31210 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
31220 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
31230 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31240 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
31250 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
31260 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
31270 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
31280 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
31290 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
312a0 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
312b0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
312c0 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
312d0 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
312e0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
312f0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
31300 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
31310 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
31320 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
31330 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
31340 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
31350 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
31360 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
31370 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
31380 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
31390 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
313a0 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
313b0 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
313c0 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
313d0 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
313e0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
313f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
31400 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
31410 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
31420 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
31430 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
31440 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
31450 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
31460 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
31470 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
31480 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
31490 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
314a0 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
314b0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
314c0 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
314d0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
314e0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
314f0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
31500 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
31510 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
31520 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
31530 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
31540 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
31550 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
31560 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
31570 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
31580 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
31590 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
315a0 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
315b0 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
315c0 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
315d0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
315e0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
315f0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
31600 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
31610 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
31620 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
31630 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
31640 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
31650 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
31660 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
31670 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
31680 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
31690 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
316a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
316b0 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
316c0 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
316d0 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
316e0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
316f0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
31700 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
31710 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
31720 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
31730 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
31740 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  dx : -1);.    j 
31750 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31770 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
31780 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
31790 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
317c0 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
317d0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
317e0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26  r(i=0; i<nCell &
317f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
31800 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
31810 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
31820 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
31830 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
31840 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
31850 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
31860 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
31870 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
31880 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
31890 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
318a0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
318b0 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
318c0 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
318d0 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
318e0 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
318f0 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
31900 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  l. */.        pO
31910 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
31920 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
31930 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
31940 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
31950 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
31960 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
31970 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
31980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
31990 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
319a0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
319b0 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
319c0 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
319d0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
319e0 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dx;.        }.  
319f0 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
31a00 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20  = !leafData;  . 
31a10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
31a20 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30  sert(nOverflow>0
31a30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20   || iOverflow<i 
31a40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31a50 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70  nOverflow<2 || p
31a60 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
31a70 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  x==pOld->aOvfl[1
31a80 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
31a90 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
31aa0 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <3 || pOld->aOvf
31ab0 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[1].idx==pOld->
31ac0 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b  aOvfl[2].idx-1);
31ad0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f  .      if( i==iO
31ae0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
31af0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31     isDivider = 1
31b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d  ;.        if( (-
31b10 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b  -nOverflow)>0 ){
31b20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
31b30 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  flow++;.        
31b40 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
31b50 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b   if( i==cntNew[k
31b60 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
31b70 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
31b80 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
31b90 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
31ba0 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20  t cell on new.  
31bb0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
31bc0 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20   page k. If the 
31bd0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
31be0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
31bf0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
31c00 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
31c10 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76   cell i is a div
31c20 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  ider cell.  */. 
31c30 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70         pNew = ap
31c40 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20  New[++k];.      
31c50 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20    if( !leafData 
31c60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31c70 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
31c80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31c90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31ca0 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
31cb0 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
31cc0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
31cd0 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
31ce0 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
31cf0 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
31d00 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
31d10 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
31d20 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
31d30 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
31d40 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
31d50 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
31d60 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
31d70 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
31d80 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
31d90 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
31da0 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
31db0 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
31dc0 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
31dd0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
31de0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
31df0 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
31e00 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
31e10 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
31e20 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
31e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31e40 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
31e50 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
31e60 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
31e70 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
31e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31e90 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
31ea0 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
31eb0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
31ec0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
31ed0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
31ee0 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
31ef0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
31f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
31f10 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
31f20 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
31f30 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
31f40 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65  LITE_OK && i<nNe
31f50 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
31f60 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
31f70 0a 09 20 20 20 20 70 42 74 2c 20 67 65 74 34 62  ..    pBt, get4b
31f80 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
31f90 44 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50  Data[8]), PTRMAP
31fa0 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d  _BTREE, apNew[i]
31fb0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
31fc0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
31fd0 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43    /* The ptrmapC
31fe0 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74  heckPages() cont
31ff0 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74  ains assert() st
32000 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65  atements that ve
32010 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a  rify that.    **
32020 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70   all pointer map
32030 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63   pages are set c
32040 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69  orrectly. This i
32050 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20  s helpful while 
32060 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  .    ** debuggin
32070 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  g. This is usual
32080 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61  ly disabled beca
32090 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  use a corrupt da
320a0 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a  tabase may.    *
320b0 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72  * cause an asser
320c0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  t() statement to
320d0 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70   fail.  */.    p
320e0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
320f0 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20  apNew, nNew);.  
32100 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
32110 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b  es(&pParent, 1);
32120 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61  .#endif.  }..  a
32130 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
32140 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43  isInit );.  TRAC
32150 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
32160 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  ished: old=%d ne
32170 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
32180 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64  ,.          nOld
32190 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
321a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61  ..  /*.  ** Clea
321b0 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
321c0 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
321d0 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
321e0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
321f0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
32200 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
32210 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
32220 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
32230 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
32240 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
32250 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
32260 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
32270 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
32280 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32290 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
322a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
322b0 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
322c0 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
322d0 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
322e0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
322f0 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
32300 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
32310 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
32320 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
32330 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
32340 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
32350 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
32360 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
32370 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
32380 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
32390 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
323a0 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
323b0 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
323c0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
323d0 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
323e0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
323f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
32400 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
32410 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
32420 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
32430 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
32440 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
32450 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
32460 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
32470 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
32480 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
32490 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
324a0 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
324b0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
324c0 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
324d0 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
324e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
324f0 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
32500 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
32510 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
32520 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
32530 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
32540 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
32550 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
32560 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
32570 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
32580 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
32590 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
325a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
325b0 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
325c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
325d0 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
325e0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
325f0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32600 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
32610 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
32620 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
32630 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
32640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32650 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
32660 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
32670 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
32680 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
32690 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
326a0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
326b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
326c0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
326d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
326e0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
326f0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
32700 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
32710 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
32720 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
32730 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
32740 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
32750 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32760 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
32770 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
32780 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
32790 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
327a0 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
327b0 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
327c0 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
327d0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
327e0 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
327f0 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
32800 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
32810 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
32820 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
32830 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
32840 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
32850 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
32860 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
32870 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
32880 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
32890 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
328a0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
328b0 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
328c0 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
328d0 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20  >pgno,0)).   || 
328e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
328f0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
32900 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29  (pRoot, pChild))
32910 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41  .   || (ISAUTOVA
32920 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20  CUUM && .       
32930 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32940 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
32950 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41  pgnoChild, PTRMA
32960 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e  P_BTREE, pRoot->
32970 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20  pgno))).  ){.   
32980 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
32990 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
329a0 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
329b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
329c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
329d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
329e0 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
329f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32a00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32a10 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
32a20 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
32a30 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
32a40 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
32a50 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
32a60 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
32a70 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
32a80 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
32a90 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
32aa0 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
32ab0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
32ac0 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
32ad0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
32ae0 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
32af0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
32b00 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
32b10 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
32b20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
32b30 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
32b40 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65  erflow;..  /* Ze
32b50 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
32b60 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69  of pRoot. Then i
32b70 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73  nstall pChild as
32b80 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
32b90 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28  . */.  zeroPage(
32ba0 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61  pRoot, pChild->a
32bb0 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
32bc0 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
32bd0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
32be0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
32bf0 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
32c00 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43  .  *ppChild = pC
32c10 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  hild;.  return S
32c20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
32c30 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
32c40 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
32c50 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
32c60 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
32c70 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
32c80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
32c90 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
32ca0 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
32cb0 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
32cc0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
32cd0 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
32ce0 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
32cf0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
32d00 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42  g .** routine. B
32d10 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
32d20 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62  s are:.**.**   b
32d30 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a  alance_quick().*
32d40 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
32d50 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
32d60 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73  e_nonroot().*/.s
32d70 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
32d80 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
32d90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32da0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
32db0 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72   int nMin = pCur
32dc0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
32dd0 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20  e * 2 / 3;.  u8 
32de0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
32df0 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46  ce[13];.  u8 *pF
32e00 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54  ree = 0;..  TEST
32e10 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
32e20 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d  e_quick_called =
32e30 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   0 );.  TESTONLY
32e40 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  ( int balance_de
32e50 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20  eper_called = 0 
32e60 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  );..  do {.    i
32e70 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
32e80 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50  >iPage;.    MemP
32e90 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
32ea0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
32eb0 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
32ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
32ed0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
32ee0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  w ){.        /* 
32ef0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
32f00 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f   the b-tree is o
32f10 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
32f20 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20   case call the. 
32f30 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
32f40 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74  e_deeper() funct
32f50 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20  ion to create a 
32f60 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68  new child for th
32f70 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
32f80 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20      ** and copy 
32f90 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
32fa0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
32fb0 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  -page to it. The
32fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  .        ** next
32fd0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
32fe0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
32ff0 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64  alance the child
33000 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
33010 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  / .        asser
33020 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  t( (balance_deep
33030 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  er_called++)==0 
33040 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
33050 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
33060 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50  Page, &pCur->apP
33070 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  age[1]);.       
33080 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33090 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
330a0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b  pCur->iPage = 1;
330b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
330c0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
330d0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
330e0 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[1] = 0;.   
330f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
33100 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e  Cur->apPage[1]->
33110 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20  nOverflow );.   
33120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33130 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
33140 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
33150 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e  else if( pPage->
33160 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
33170 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d  pPage->nFree<=nM
33180 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  in ){.      brea
33190 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
331a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f      MemPage * co
331b0 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43  nst pParent = pC
331c0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
331d0 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  -1];.      int c
331e0 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72  onst iIdx = pCur
331f0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d  ->aiIdx[iPage-1]
33200 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
33210 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33220 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
33230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
33240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
33250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33260 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
33270 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33280 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20  ->hasData.      
33290 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76     && pPage->nOv
332a0 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20  erflow==1.      
332b0 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76     && pPage->aOv
332c0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
332d0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
332e0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
332f0 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
33300 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
33310 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
33320 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
33330 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
33340 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
33350 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
33360 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
33370 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
33380 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
33390 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
333a0 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
333b0 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
333c0 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
333d0 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
333e0 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
333f0 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
33400 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
33410 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
33420 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
33430 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
33440 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
33450 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
33460 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
33470 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
33480 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
33490 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
334a0 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
334b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
334c0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
334d0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
334e0 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
334f0 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
33500 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
33510 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
33520 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
33530 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
33540 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
33550 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
33560 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
33570 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
33580 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
33590 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
335a0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
335b0 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
335c0 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
335d0 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
335e0 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
335f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
33600 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
33610 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
33620 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
33630 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
33640 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
33650 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
33660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
33670 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
33680 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
33690 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
336a0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
336b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
336c0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
336d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
336e0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
336f0 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
33700 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
33710 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
33720 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
33730 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
33740 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
33750 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
33760 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
33770 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
33780 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
33790 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74   cause pParent t
337a0 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
337b0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
337c0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65  r underfull. The
337d0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
337e0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20  of the do-loop. 
337f0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c           ** will
33800 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
33810 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72  ent page to corr
33820 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20  ect this..      
33830 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
33840 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65    ** If the pare
33850 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20  nt page becomes 
33860 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76  overfull, the ov
33870 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63  erflow cell or c
33880 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
33890 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
338a0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
338b0 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65  r allocated imme
338c0 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a  diately below. .
338d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73            ** A s
338e0 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
338f0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
33900 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  op will deal wit
33910 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  h this by.      
33920 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62      ** calling b
33930 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33940 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
33950 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
33960 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20   first,.        
33970 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
33980 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76  n't deal with ov
33990 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a  erflow cells - j
339a0 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74  ust moves them t
339b0 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  o a.          **
339c0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29   different page)
339d0 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73  . Once this subs
339e0 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62  equent call to b
339f0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33a00 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68   .          ** h
33a10 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74  as completed, it
33a20 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65   is safe to rele
33a30 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62  ase the pSpace b
33a40 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20  uffer used by.  
33a50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
33a60 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73  revious call, as
33a70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
33a80 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76  ll data will hav
33a90 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  e been .        
33aa0 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68    ** copied eith
33ab0 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  er into the body
33ac0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
33ad0 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20  age or into the 
33ae0 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  new.          **
33af0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70   pSpace buffer p
33b00 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74  assed to the lat
33b10 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ter call to bala
33b20 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20  nce_nonroot().. 
33b30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
33b40 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65        u8 *pSpace
33b50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
33b60 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e  lloc(pCur->pBt->
33b70 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
33b80 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
33b90 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e  e_nonroot(pParen
33ba0 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c  t, iIdx, pSpace,
33bb0 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20   iPage==1);.    
33bc0 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
33bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
33be0 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f  * If pFree is no
33bf0 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
33c00 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  s to the pSpace 
33c10 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20  buffer used .   
33c20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61           ** by a
33c30 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
33c40 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
33c50 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  t(). Its content
33c60 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20  s are.          
33c70 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20    ** now stored 
33c80 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64  either on real d
33c90 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72  atabase pages or
33ca0 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20   within the .   
33cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20           ** new 
33cc0 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73  pSpace buffer, s
33cd0 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65  o it may be safe
33ce0 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a  ly freed here. *
33cf0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
33d00 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
33d10 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
33d20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
33d30 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
33d40 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  r will be freed 
33d50 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63  after the next c
33d60 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
33d70 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   ** balance_nonr
33d80 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62  oot(), or just b
33d90 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
33da0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69  ion returns, whi
33db0 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20  chever.         
33dc0 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e   ** comes first.
33dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46   */.          pF
33de0 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20  ree = pSpace;.  
33df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33e00 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
33e10 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
33e20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
33e30 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
33e40 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65   do-loop balance
33e50 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
33e60 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65  e. */.      rele
33e70 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
33e80 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
33e90 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  e--;.    }.  }wh
33ea0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
33eb0 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72  OK );..  if( pFr
33ec0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
33ed0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
33ee0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33ef0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  c;.}.../*.** Ins
33f00 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
33f10 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
33f20 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
33f30 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
33f40 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
33f50 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
33f60 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
33f70 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
33f80 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
33f90 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
33fa0 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
33fb0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
33fc0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
33fd0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
33fe0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
33ff0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
34000 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
34010 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
34020 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
34030 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
34040 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
34050 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
34060 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
34070 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
34080 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  oth ignored..**.
34090 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
340a0 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
340b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
340c0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
340d0 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55  ll to.** MovetoU
340e0 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65  npacked() to see
340f0 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f  k cursor pCur to
34100 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61   (pKey, nKey) ha
34110 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
34120 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65  n performed. see
34130 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73  kResult is the s
34140 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74  earch result ret
34150 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76  urned (a negativ
34160 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70  e.** number if p
34170 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
34180 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73   entry that is s
34190 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65  maller than (pKe
341a0 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20  y, nKey), or.** 
341b0 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
341c0 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
341d0 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20  at an etry that 
341e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a  is larger than .
341f0 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29  ** (pKey, nKey))
34200 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
34210 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
34220 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
34230 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 20  cursor pCur may 
34240 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a  point to any .**
34250 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20   entry or to no 
34260 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e  entry at all. In
34270 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
34280 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
34290 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73  seek.** the curs
342a0 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65  or before the ne
342b0 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73  w key can be ins
342c0 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
342d0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
342e0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
342f0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
34300 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
34310 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
34320 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
34330 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
34340 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
34350 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
34360 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
34370 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
34380 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
34390 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
343a0 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
343b0 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
343c0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
343d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
343e0 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
343f0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
34400 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
34410 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20 20  endBias,        
34420 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34430 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
34440 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20  y an append */. 
34450 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20   int seekResult 
34460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34470 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69  /* Result of pri
34480 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  or MovetoUnpacke
34490 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20  d() call */.){. 
344a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
344b0 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b  oc = seekResult;
344c0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
344d0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
344e0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
344f0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
34500 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
34510 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
34520 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34530 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
34540 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
34550 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
34560 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
34570 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
34580 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
34590 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
345a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
345b0 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
345c0 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
345d0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a  pCur->wrFlag );.
345e0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
345f0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
34600 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
34610 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
34620 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20  nfo!=0, 2) );.. 
34630 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
34640 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20  n insert into a 
34650 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e  table b-tree, in
34660 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
34670 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73  rblob .  ** curs
34680 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
34690 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63  row being replac
346a0 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69  ed (assuming thi
346b0 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20  s is a replace. 
346c0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20   ** operation - 
346d0 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  if it is not, th
346e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
346f0 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69   no-op).  */.  i
34700 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
34710 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
34720 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
34730 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70  rsors(p, pCur->p
34740 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30  gnoRoot, nKey, 0
34750 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
34760 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
34770 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
34780 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
34790 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
347a0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
347b0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
347c0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
347d0 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  s table..  **.  
347e0 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  ** In some cases
347f0 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74  , the call to bt
34800 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f  reeMoveto() belo
34810 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f  w is a no-op. Fo
34820 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  r.  ** example, 
34830 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
34840 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
34850 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72   with auto-gener
34860 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a  ated integer.  *
34870 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45  * keys, the VDBE
34880 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73   layer invokes s
34890 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
348a0 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
348b0 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65  the .  ** intege
348c0 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74  r key to use. It
348d0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73   then calls this
348e0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74   function to act
348f0 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65  ually insert the
34900 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f   .  ** data into
34910 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72   the intkey B-Tr
34920 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
34930 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72   btreeMoveto() r
34940 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74  ecognizes.  ** t
34950 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
34960 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65 20  s already where 
34970 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
34980 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  nd returns witho
34990 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e  ut.  ** doing an
349a0 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64  y work. To avoid
349b0 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73 65   thwarting these
349c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20   optimizations, 
349d0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a  it is important.
349e0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61    ** not to clea
349f0 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65 72  r the cursor her
34a00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20 20  e..  */.  if(.  
34a10 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
34a20 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
34a30 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
34a40 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c  oRoot, pCur)) ||
34a50 20 28 21 6c 6f 63 20 26 26 0a 20 20 20 20 53 51   (!loc &&.    SQ
34a60 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
34a70 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
34a80 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
34a90 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
34aa0 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e    )){.    return
34ab0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
34ac0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
34ad0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
34ae0 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d   (pCur->eState==
34af0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26  CURSOR_INVALID &
34b00 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61  & loc) );..  pPa
34b10 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
34b20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
34b30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34b40 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
34b50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34b60 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
34b70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
34b80 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
34b90 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
34ba0 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
34bb0 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
34bc0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
34bd0 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
34be0 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
34bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
34c00 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
34c10 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
34c20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34c30 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
34c40 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
34c50 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
34c60 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
34c70 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
34c80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
34c90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
34ca0 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
34cb0 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
34cc0 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
34cd0 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
34ce0 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
34cf0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
34d00 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
34d10 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
34d20 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
34d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
34d40 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
34d50 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d  (pBt) );.  idx =
34d60 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
34d70 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
34d80 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75   loc==0 ){.    u
34d90 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  16 szOld;.    as
34da0 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d  sert( idx<pPage-
34db0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
34dc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34dd0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
34de0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
34df0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
34e00 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
34e10 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
34e20 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
34e30 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
34e40 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34e50 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
34e60 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
34e70 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
34e80 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
34e90 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
34ea0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
34eb0 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
34ec0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
34ed0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
34ee0 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65  .    rc = dropCe
34ef0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
34f00 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72  zOld);.    if( r
34f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  c!=SQLITE_OK ) {
34f20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
34f30 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
34f40 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
34f50 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
34f60 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
34f70 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
34f80 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
34f90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
34fa0 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age];.  }else{. 
34fb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34fc0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
34fd0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
34fe0 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43  pPage, idx, newC
34ff0 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
35000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
35010 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
35020 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
35030 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35040 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  >0 );..  /* If n
35050 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
35060 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61  red and pPage ha
35070 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  s an overflow ce
35080 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ll, call balance
35090 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69  () .  ** to redi
350a0 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c  stribute the cel
350b0 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ls within the tr
350c0 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63  ee. Since balanc
350d0 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a  e() may move.  *
350e0 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65  * the cursor, ze
350f0 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  ro the BtCursor.
35100 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42  info.nSize and B
35110 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65  tCursor.validNKe
35120 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  y.  ** variables
35130 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76  ..  **.  ** Prev
35140 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
35150 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d   SQLite called m
35160 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d  oveToRoot() to m
35170 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20  ove the cursor. 
35180 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20   ** back to the 
35190 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c  root page as bal
351a0 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69  ance() used to i
351b0 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
351c0 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42  ntents.  ** of B
351d0 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d  tCursor.apPage[]
351e0 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69   and BtCursor.ai
351f0 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f  Idx[]. Instead o
35200 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20  f doing that,.  
35210 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  ** set the curso
35220 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61  r state to "inva
35230 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73  lid". This makes
35240 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f   common insert o
35250 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73  perations.  ** s
35260 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a  lightly faster..
35270 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20    **.  ** There 
35280 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20  is a subtle but 
35290 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69  important optimi
352a0 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e  zation here too.
352b0 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a   When inserting.
352c0 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65    ** multiple re
352d0 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e  cords into an in
352e0 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e  tkey b-tree usin
352f0 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f  g a single curso
35300 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68  r (as can.  ** h
35310 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63  appen while proc
35320 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52  essing an "INSER
35330 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
35340 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69  T" statement), i
35350 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74  t.  ** is advant
35360 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20  ageous to leave 
35370 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
35380 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
35390 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68  entry in.  ** th
353a0 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73  e b-tree if poss
353b0 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72  ible. If the cur
353c0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
353d0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
353e0 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  .  ** entry in t
353f0 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  he table, and th
35400 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72  e next row inser
35410 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ted has an integ
35420 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67  er key.  ** larg
35430 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
35440 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79  est existing key
35450 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
35460 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20   to insert the. 
35470 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20   ** row without 
35480 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73  seeking the curs
35490 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  or. This can be 
354a0 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63  a big performanc
354b0 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20  e boost..  */.  
354c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
354d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
354e0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
354f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35500 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
35510 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d  flow ){.    rc =
35520 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
35530 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  .    /* Must mak
35540 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
35550 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
35560 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
35570 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66  lance().    ** f
35580 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64  ails. Internal d
35590 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
355a0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
355b0 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
355c0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65  .    ** Also, se
355d0 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
355e0 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54  te to invalid. T
355f0 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75  his stops saveCu
35600 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20  rsorPosition(). 
35610 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
35620 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75  g to save the cu
35630 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
35640 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  f the cursor.  *
35650 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
35660 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
35670 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
35680 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
35690 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
356a0 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  D;.  }.  assert(
356b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
356c0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
356d0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64  rflow==0 );..end
356e0 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
356f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
35700 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
35710 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
35720 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
35730 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
35740 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
35750 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
35760 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
35770 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
35780 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
35790 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  r){.  Btree *p =
357a0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
357b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
357c0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
357d0 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b        .  int rc;
357e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35800 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35810 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35830 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
35840 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72  o delete cell fr
35850 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  om */.  unsigned
35860 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20   char *pCell;   
35870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35880 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20  Pointer to cell 
35890 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
358a0 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20  nt iCellIdx;    
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
358d0 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
358e0 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70  /.  int iCellDep
358f0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
35900 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
35910 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  h of node contai
35920 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a  ning pCell */ ..
35930 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
35940 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
35950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
35960 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
35970 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
35980 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
35990 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
359a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
359b0 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
359c0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
359d0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
359e0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
359f0 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
35a00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
35a10 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
35a20 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
35a30 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ot) );..  if( NE
35a40 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
35a50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
35a60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
35a70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
35a80 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
35a90 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
35aa0 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
35ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35ac0 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
35ad0 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
35ae0 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ry. */.  }..  /*
35af0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
35b00 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74  lete operation t
35b10 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66  o remove a row f
35b20 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72  rom a table b-tr
35b30 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64  ee,.  ** invalid
35b40 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
35b50 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
35b60 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
35b70 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66  eleted.  */.  if
35b80 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
35b90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
35ba0 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
35bb0 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  sors(p, pCur->pg
35bc0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e  noRoot, pCur->in
35bd0 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d  fo.nKey, 0);.  }
35be0 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d  ..  iCellDepth =
35bf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
35c00 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d  iCellIdx = pCur-
35c10 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74  >aiIdx[iCellDept
35c20 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  h];.  pPage = pC
35c30 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c  ur->apPage[iCell
35c40 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20  Depth];.  pCell 
35c50 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
35c60 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20  , iCellIdx);..  
35c70 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  /* If the page c
35c80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
35c90 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73  try to delete is
35ca0 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
35cb0 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  , move.  ** the 
35cc0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
35cd0 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74  rgest entry in t
35ce0 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20  he tree that is 
35cf0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a  smaller than.  *
35d00 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e  * the entry bein
35d10 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
35d20 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63  cell will replac
35d30 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  e the cell being
35d40 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72   deleted.  ** fr
35d50 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
35d60 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69  node. The 'previ
35d70 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73  ous' entry is us
35d80 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  ed for this inst
35d90 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ead.  ** of the 
35da0 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73  'next' entry, as
35db0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
35dc0 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20  try is always a 
35dd0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
35de0 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
35df0 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61   by the child pa
35e00 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62  ge of the cell b
35e10 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68  eing deleted. Th
35e20 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61  is makes.  ** ba
35e30 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65  lancing the tree
35e40 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
35e50 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
35e60 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66  easier.  */.  if
35e70 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35e80 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
35e90 64 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  d;.    if( SQLIT
35ea0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
35eb0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
35ec0 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  (pCur, &notUsed)
35ed0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
35ee0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
35ef0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
35f00 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
35f10 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
35f20 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
35f30 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b   before.  ** mak
35f40 69 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61  ing any modifica
35f50 74 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20  tions. Make the 
35f60 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
35f70 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20  the entry to be 
35f80 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72  .  ** deleted wr
35f90 69 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65  itable. Then fre
35fa0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
35fb0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
35fc0 77 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65  with the .  ** e
35fd0 6e 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ntry and finally
35fe0 20 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c   remove the cell
35ff0 20 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74   itself from wit
36000 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20 2a  hin the page.  *
36010 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
36020 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
36030 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
36040 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
36050 72 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  r)).   || SQLITE
36060 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
36070 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
36080 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
36090 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
360a0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
360b0 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 0a 20 20  Page, pCell)).  
360c0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
360d0 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
360e0 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63  age, iCellIdx, c
360f0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
36100 2c 20 70 43 65 6c 6c 29 29 29 0a 20 20 29 7b 0a  , pCell))).  ){.
36110 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36120 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
36130 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61 73  cell deleted was
36140 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20   not located on 
36150 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
36160 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a  n the cursor.  *
36170 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
36180 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
36190 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20  argest entry in 
361a0 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61  the sub-tree hea
361b0 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ded.  ** by the 
361c0 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74 68  child-page of th
361d0 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73 20  e cell that was 
361e0 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72 6f  just deleted fro
361f0 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  m an internal.  
36200 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65 6c  ** node. The cel
36210 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20  l from the leaf 
36220 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62 65  node needs to be
36230 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69 6e   moved to the in
36240 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65  ternal.  ** node
36250 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
36260 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20 2a  deleted cell.  *
36270 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  /.  if( !pPage->
36280 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d 50  leaf ){.    MemP
36290 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43 75  age *pLeaf = pCu
362a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
362b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
362c0 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f 20  nCell;.    Pgno 
362d0 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  n = pCur->apPage
362e0 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e  [iCellDepth+1]->
362f0 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  pgno;.    unsign
36300 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a 0a  ed char *pTmp;..
36310 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
36320 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
36330 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  f->nCell-1);.   
36340 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a   nCell = cellSiz
36350 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65 6c  ePtr(pLeaf, pCel
36360 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
36370 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
36380 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20  )>=nCell );..   
36390 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
363a0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54 6d  ce(pBt);.    pTm
363b0 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  p = pBt->pTmpSpa
363c0 63 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51 4c  ce;..    if( SQL
363d0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
363e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
363f0 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29 29  pLeaf->pDbPage))
36400 20 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45   .     || SQLITE
36410 5f 4f 4b 21 3d 28 72 63 20 3d 20 69 6e 73 65 72  _OK!=(rc = inser
36420 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  tCell(pPage, iCe
36430 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20  llIdx, pCell-4, 
36440 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e  nCell+4, pTmp, n
36450 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
36460 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70  E_OK!=(rc = drop
36470 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
36480 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c  f->nCell-1, nCel
36490 6c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  l)).    ){.     
364a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
364b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61  }.  }..  /* Bala
364c0 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66  nce the tree. If
364d0 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
364e0 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ed was located o
364f0 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20  n a leaf page,. 
36500 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72   ** then the cur
36510 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  sor still points
36520 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49   to that page. I
36530 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
36540 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  first.  ** call 
36550 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70  to balance() rep
36560 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61  airs the tree, a
36570 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63  nd the if(...) c
36580 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  ondition is.  **
36590 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a   never true..  *
365a0 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  *.  ** Otherwise
365b0 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64  , if the entry d
365c0 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e  eleted was on an
365d0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70   internal node p
365e0 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70  age, then.  ** p
365f0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
36600 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
36610 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65   from which a ce
36620 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74  ll was removed t
36630 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74  o.  ** replace t
36640 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20  he cell deleted 
36650 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
36660 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  l node. This is 
36670 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72  slightly.  ** tr
36680 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66  icky as the leaf
36690 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64   node may be und
366a0 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20  erfull, and the 
366b0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61  internal node ma
366c0 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72  y.  ** be either
366d0 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75   under or overfu
366e0 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
366f0 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69   run the balanci
36700 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a  ng algorithm.  *
36710 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f  * on the leaf no
36720 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65  de first. If the
36730 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64   balance proceed
36740 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20  s far enough up 
36750 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68  the.  ** tree th
36760 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72  at we can be sur
36770 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c  e that any probl
36780 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e  em in the intern
36790 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a  al node has.  **
367a0 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c   been corrected,
367b0 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72   so be it. Other
367c0 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61  wise, after bala
367d0 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e  ncing the leaf n
367e0 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74  ode,.  ** walk t
367f0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65  he cursor up the
36800 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74   tree to the int
36810 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62  ernal node and b
36820 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20  alance it as .  
36830 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72  ** well.  */.  r
36840 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
36850 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
36860 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e  ITE_OK && pCur->
36870 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
36880 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
36890 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
368a0 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72  Depth ){.      r
368b0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
368c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
368d0 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20  age--]);.    }. 
368e0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
368f0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
36900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36910 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
36920 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
36930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36940 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
36950 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
36960 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
36970 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
36980 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
36990 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
369a0 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
369b0 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
369c0 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
369d0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
369e0 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
369f0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
36a00 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
36a10 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
36a20 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
36a30 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
36a40 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
36a50 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
36a60 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
36a70 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
36a80 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
36a90 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
36aa0 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
36ab0 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
36ac0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
36ad0 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
36ae0 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74  c int btreeCreat
36af0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
36b00 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
36b10 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
36b20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
36b30 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
36b40 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
36b50 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
36b60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
36b70 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
36b80 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
36b90 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
36ba0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
36bb0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
36bc0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
36bd0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
36be0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36bf0 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  M.  rc = allocat
36c00 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
36c10 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
36c20 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  t, 1, 0);.  if( 
36c30 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
36c40 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20   rc;.  }.#else. 
36c50 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
36c60 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
36c70 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20   pgnoMove;      
36c80 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68  /* Move a page h
36c90 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  ere to make room
36ca0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
36cb0 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  ge */.    MemPag
36cc0 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a  e *pPageMove; /*
36cd0 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76   The page to mov
36ce0 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e to. */..    /*
36cf0 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   Creating a new 
36d00 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62  table may probab
36d10 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ly require movin
36d20 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61  g an existing da
36d30 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f  tabase.    ** to
36d40 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
36d50 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f  he new tables ro
36d60 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65  ot page. In case
36d70 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73   this page turns
36d80 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  .    ** out to b
36d90 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
36da0 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f  ge, delete all o
36db0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70  verflow page-map
36dc0 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68   caches.    ** h
36dd0 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73  eld by open curs
36de0 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ors..    */.    
36df0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
36e00 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
36e10 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
36e20 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
36e30 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
36e40 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
36e50 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
36e60 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
36e70 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
36e80 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
36e90 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
36ea0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
36eb0 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
36ec0 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
36ed0 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page is (meta[3
36ee0 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ]+1)..    */.   
36ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
36f00 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41  Meta(p, BTREE_LA
36f10 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c  RGEST_ROOT_PAGE,
36f20 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
36f30 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
36f40 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
36f50 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
36f60 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
36f70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
36f80 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
36f90 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
36fa0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
36fb0 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
36fc0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
36fd0 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
36fe0 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
36ff0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37000 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
37010 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
37020 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37030 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
37040 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
37050 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
37060 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
37070 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
37080 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
37090 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
370a0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
370b0 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
370c0 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
370d0 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
370e0 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
370f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
37100 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37110 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
37120 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
37130 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
37140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
37160 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
37170 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
37180 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
37190 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
371a0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
371b0 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
371c0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
371d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
371e0 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
371f0 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
37200 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
37210 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
37220 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
37230 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
37240 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
37250 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
37260 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
37270 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
37280 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
37290 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
372a0 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
372b0 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
372c0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
372d0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
372e0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
372f0 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
37300 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
37310 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
37320 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
37330 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
37340 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
37350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37360 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
37370 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
37380 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
37390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
373a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
373b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
373c0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
373d0 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
373e0 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
373f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37400 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
37410 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65  OOTPAGE || eType
37420 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
37430 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
37440 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
37450 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
37460 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37480 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
37490 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
374a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
374b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
374c0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
374d0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
374e0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
374f0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
37500 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
37510 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
37520 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
37530 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20  Page, pgnoMove, 
37540 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  0);.      releas
37550 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
37560 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
37570 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
37580 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
37590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
375a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
375b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
375c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
375d0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
375e0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
375f0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
37600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37610 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37620 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37640 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
37650 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
37660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
37680 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
37690 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
376a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
376b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
376c0 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
376d0 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
376e0 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
376f0 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
37700 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
37710 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
37720 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
37730 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
37740 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
37750 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
37760 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
37780 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
37790 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
377a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
377b0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
377c0 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
377d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
377e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
377f0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
37800 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
37810 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
37820 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
37830 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
37840 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
37850 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37860 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
37870 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
37880 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37890 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
378a0 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
378b0 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
378c0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
378d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
378e0 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
378f0 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
37900 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
37910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37920 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
37930 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
37940 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
37950 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
37960 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
37970 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
37980 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
37990 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
379a0 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
379b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
379c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
379d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
379e0 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
379f0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
37a00 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
37a10 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
37a20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
37a30 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
37a40 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
37a50 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
37a60 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
37a70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
37a80 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
37a90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
37aa0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
37ab0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
37ac0 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
37ad0 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
37ae0 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag,     /* Deal
37af0 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
37b00 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rue */.  int *pn
37b10 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50  Change.){.  MemP
37b20 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
37b30 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
37b40 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
37b50 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
37b60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37b70 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
37b80 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
37b90 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
37ba0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  t(pBt) ){.    re
37bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
37bc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
37bd0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
37be0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
37bf0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
37c00 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
37c10 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
37c20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
37c30 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
37c40 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
37c50 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
37c60 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
37c70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
37c80 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
37c90 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
37ca0 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70  yte(pCell), 1, p
37cb0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
37cc0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
37cd0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
37ce0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
37cf0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
37d00 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
37d10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
37d20 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
37d30 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
37d40 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37d50 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
37d60 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
37d70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
37d80 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70  >aData[8]), 1, p
37d90 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66  nChange);.    if
37da0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
37db0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
37dc0 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
37dd0 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61  nChange ){.    a
37de0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
37df0 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43  tKey );.    *pnC
37e00 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e  hange += pPage->
37e10 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28  nCell;.  }.  if(
37e20 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
37e30 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
37e40 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
37e50 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
37e60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37e70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
37e80 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
37e90 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
37ea0 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
37eb0 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
37ec0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
37ed0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
37ee0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
37ef0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
37f00 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
37f10 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
37f20 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
37f30 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
37f40 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67  le is.** the pag
37f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
37f60 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
37f70 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  e.  After this r
37f80 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a  outine returns,.
37f90 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
37fa0 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73   is empty, but s
37fb0 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  till exists..**.
37fc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
37fd0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
37fe0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
37ff0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
38000 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f  en.** read curso
38010 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
38020 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72    Open write cur
38030 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74  sors are moved t
38040 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66  o the.** root of
38050 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
38060 2a 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73  * If pnChange is
38070 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
38080 74 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73  table iTable mus
38090 74 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74  t be an intkey t
380a0 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74  able. The.** int
380b0 65 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74  eger value point
380c0 65 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67  ed to by pnChang
380d0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
380e0 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
380f0 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20  f.** entries in 
38100 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  the table..*/.in
38110 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
38120 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a  earTable(Btree *
38130 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
38140 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20  nt *pnChange){. 
38150 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
38160 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
38170 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
38180 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
38190 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
381a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
381b0 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65  .  /* Invalidate
381c0 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 75   all incrblob cu
381d0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 61  rsors open on ta
381e0 62 6c 65 20 69 54 61 62 6c 65 20 28 61 73 73 75  ble iTable (assu
381f0 6d 69 6e 67 20 69 54 61 62 6c 65 0a 20 20 2a 2a  ming iTable.  **
38200 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
38210 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2d  a table b-tree -
38220 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   if it is not, t
38230 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
38240 6c 20 69 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f  l is.  ** a no-o
38250 70 29 2e 20 20 2a 2f 0a 20 20 69 6e 76 61 6c 69  p).  */.  invali
38260 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
38270 6f 72 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  ors(p, iTable, 0
38280 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c  , 1);..  if( SQL
38290 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 61  ITE_OK==(rc = sa
382a0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
382b0 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
382c0 30 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  0)) ){.    rc = 
382d0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
382e0 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
382f0 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  ble, 0, pnChange
38300 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
38310 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
38320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
38330 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
38340 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
38350 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
38360 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
38370 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
38380 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
38390 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
383a0 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
383b0 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
383c0 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
383d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
383e0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
383f0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
38400 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
38410 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
38420 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
38430 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
38440 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
38450 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
38460 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
38470 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
38480 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
38490 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
384a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
384b0 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
384c0 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
384d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he datab