/ Hex Artifact Content
Login

Artifact efad7a5ac6c460aa326de8df290e72af54b2a96e:


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 34 20 32 30 30 39 2f 30  c,v 1.654 2009/0
0190: 37 2f 30 37 20 30 32 3a 34 34 3a 30 37 20 64 72  7/07 02:44:07 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 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5f30: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
5f40: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
5f50: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
5f60: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
5f70: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
5f80: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
5f90: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
5fa0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
5fb0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
5fc0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
5fd0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
5fe0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
5ff0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6000: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
6010: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6020: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6030: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6040: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
6050: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
6060: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
6070: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
6080: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6090: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
60a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
60b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
60c0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
60d0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
60e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
60f0: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
6100: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
6110: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
6120: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
6130: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
6140: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
6150: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
6160: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
6170: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6180: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
6190: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
61a0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
61b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
61c0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
61d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
61e0: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
61f0: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
6200: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
6210: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
6220: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
6230: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
6240: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
6250: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
6260: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
6270: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
6280: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
6290: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
62a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
62b0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
62c0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
62d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
62e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
62f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6300: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
6310: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
6320: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
6330: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
6340: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
6350: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
6360: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
6370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
6380: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
6390: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
63a0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
63b0: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
63c0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
63d0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
63e0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
63f0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6400: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6410: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6420: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6430: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6440: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6450: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6460: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6470: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6480: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6490: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
64a0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
64c0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
64d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
64e0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
64f0: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6500: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6510: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6520: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
6530: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
6540: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
6550: 72 28 78 2c 20 79 29 20 53 51 4c 49 54 45 5f 4f  r(x, y) SQLITE_O
6560: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
6570: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6580: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
6590: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
65a0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
65b0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
65c0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
65d0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
65e0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
65f0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6600: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6610: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6620: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6630: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6640: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6650: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
6660: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
6670: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
6680: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
6690: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
66a0: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
66b0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
66c0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
66d0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
66e0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
66f0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
6700: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
6710: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
6720: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
6730: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
6740: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
6750: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
6760: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
6770: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
6780: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6790: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
67a0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
67b0: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
67c0: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
67d0: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
67e0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
67f0: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
6800: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
6810: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
6820: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
6830: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
6840: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
6850: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
6860: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
6870: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
6880: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
6890: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
68a0: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
68b0: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
68c0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
68d0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
68e0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
68f0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
6900: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
6910: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
6920: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
6930: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
6940: 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20  eCell() takes a 
6950: 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61  .** cell index a
6960: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
6970: 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65  ument and sqlite
6980: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
6990: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
69a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
69b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
69c0: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
69d0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
69e0: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
69f0: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
6a00: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
6a10: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
6a20: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
6a30: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
6a40: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
6a50: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
6a60: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  e faster..*/.voi
6a70: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
6a80: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
6a90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
6aa0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
6ab0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
6ac0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
6ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6ae0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
6af0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
6b00: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
6b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
6b20: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
6b30: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
6b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6b50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
6b60: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
6b70: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
6b80: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
6b90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6ba0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
6bb0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
6bc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6bd0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6be0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6bf0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
6c00: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
6c10: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
6c20: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
6c30: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
6c40: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
6c50: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
6c60: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
6c70: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
6c80: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
6c90: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
6ca0: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67   ){.      n += g
6cb0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
6cc0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
6cd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6ce0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a    nPayload = 0;.
6cf0: 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67      }.    n += g
6d00: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
6d10: 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  n], (u64*)&pInfo
6d20: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e  ->nKey);.    pIn
6d30: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
6d40: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
6d50: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
6d60: 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  = 0;.    n += ge
6d70: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
6d80: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
6d90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
6da0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a  = nPayload;.  }.
6db0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
6dc0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
6dd0: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
6de0: 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   n;.  if( likely
6df0: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
6e00: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
6e10: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
6e20: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
6e30: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
6e40: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
6e50: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
6e60: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
6e70: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
6e80: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
6e90: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
6ea0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
6eb0: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
6ec0: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
6ed0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
6ee0: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49  load + n;.    pI
6ef0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
6f00: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
6f10: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
6f20: 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  w = 0;.    if( (
6f30: 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29  nSize & ~3)==0 )
6f40: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
6f50: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e  4;        /* Min
6f60: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
6f70: 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  s 4 */.    }.   
6f80: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
6f90: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65  (u16)nSize;.  }e
6fa0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
6fb0: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
6fc0: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
6fd0: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
6fe0: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
6ff0: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
7000: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
7010: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
7020: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
7030: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
7040: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
7050: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
7060: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
7070: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
7080: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
7090: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
70a0: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
70b0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
70c0: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
70d0: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
70e0: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
70f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
7100: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
7110: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
7120: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
7130: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
7140: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
7150: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
7160: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
7170: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
7180: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
7190: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
71a0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
71b0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
71c0: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
71d0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
71e0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
71f0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
7200: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
7210: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
7220: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
7230: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
7240: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
7250: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7260: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
7270: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
7280: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
7290: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
72a0: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
72b0: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
72c0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
72d0: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
72e0: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
72f0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7300: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
7310: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
7320: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
7330: 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63  al = (u16)minLoc
7340: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
7350: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
7360: 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c   (u16)(pInfo->nL
7370: 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70  ocal + n);.    p
7380: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
7390: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
73a0: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
73b0: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
73c0: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
73d0: 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   \.  sqlite3Btre
73e0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
73f0: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
7400: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
7410: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64  ), (pInfo)).void
7420: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
7430: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
7440: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7450: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7460: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7470: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
7480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7490: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
74a0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
74b0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
74c0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
74d0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
74e0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
74f0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
7500: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
7510: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
7520: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
7530: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
7540: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
7550: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
7560: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
7570: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
7580: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
7590: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
75a0: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
75b0: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
75c0: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
75d0: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
75e0: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
75f0: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
7600: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
7610: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
7620: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7630: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
7640: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
7650: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
7660: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
7670: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
7680: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
7690: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
76a0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
76b0: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
76c0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
76d0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
76e0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
76f0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
7700: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
7710: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
7720: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
7730: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
7740: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
7750: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
7760: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
7770: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
7780: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
7790: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
77a0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
77b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
77c0: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
77d0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
77e0: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
77f0: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
7800: 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  y ){.    u8 *pEn
7810: 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  d;.    if( pPage
7820: 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
7830: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
7840: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
7850: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
7860: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
7870: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
7880: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
7890: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
78a0: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
78b0: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
78c0: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
78d0: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
78e0: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
78f0: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
7900: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
7910: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
7920: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
7930: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
7940: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
7950: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
7960: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
7970: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65  ter<pEnd );.  }e
7980: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b  lse{.    pIter +
7990: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
79a0: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d  ter, nSize);.  }
79b0: 0a 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50  ..  if( nSize>pP
79c0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
79d0: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
79e0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
79f0: 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  cal;.    nSize =
7a00: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69   minLocal + (nSi
7a10: 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25  ze - minLocal) %
7a20: 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
7a30: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
7a40: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
7a50: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
7a60: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
7a70: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
7a80: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20    nSize += 4;.  
7a90: 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33  }.  nSize += (u3
7aa0: 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  2)(pIter - pCell
7ab0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e  );..  /* The min
7ac0: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79  imum size of any
7ad0: 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73   cell is 4 bytes
7ae0: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65  . */.  if( nSize
7af0: 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  <4 ){.    nSize 
7b00: 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 4;.  }..  asse
7b10: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
7b20: 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
7b30: 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a  return (u16)nSiz
7b40: 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  e;.}.#ifndef NDE
7b50: 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63  BUG.static u16 c
7b60: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
7b70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
7b80: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
7b90: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
7ba0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7bb0: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
7bc0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
7bd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7be0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
7bf0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
7c00: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
7c10: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
7c20: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
7c30: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
7c40: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
7c50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
7c60: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
7c70: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
7c80: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
7c90: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
7ca0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
7cb0: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
7cc0: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
7cd0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ell!=0 );.  sqli
7ce0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
7cf0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
7d00: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
7d10: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
7d20: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
7d30: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
7d40: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
7d50: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
7d60: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f  flow ){.    Pgno
7d70: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
7d80: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
7d90: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65  erflow]);.    re
7da0: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
7db0: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
7dc0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
7dd0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
7de0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7df0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
7e00: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
7e10: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
7e20: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
7e30: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
7e40: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
7e50: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
7e60: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
7e70: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
7e80: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
7e90: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
7ea0: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
7eb0: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
7ec0: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
7ed0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
7ee0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  a..*/.static int
7ef0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
7f00: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
7f10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
7f40: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f60: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d   Address of a i-
7f70: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
7f80: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
7f90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
7fa0: 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20  t of first byte 
7fb0: 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74  after cell point
7fc0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
7fd0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
7fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
7ff0: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
8000: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
8010: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8020: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8030: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
8040: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
8050: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8060: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
8070: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
8080: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
8090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
80a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
80b0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
80c0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
80f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8100: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
8110: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8120: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8130: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
8140: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
8150: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
8160: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
8170: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
8180: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
8190: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
81a0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
81b0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
81c0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
81d0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
81e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
81f0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
8200: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8210: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8220: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
8230: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
8240: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8250: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
8260: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8270: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8280: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8290: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71  ) );.  temp = sq
82a0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
82b0: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
82c0: 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20  pPager);.  data 
82d0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
82e0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
82f0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
8300: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
8310: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
8320: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
8330: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
8340: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
8350: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
8360: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
8370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8380: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67  Size;.  cbrk = g
8390: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
83a0: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
83b0: 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61  &temp[cbrk], &da
83c0: 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ta[cbrk], usable
83d0: 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20  Size - cbrk);.  
83e0: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
83f0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
8400: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8410: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8420: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8430: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8440: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8450: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8460: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8470: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69  te(pAddr);.    i
8480: 66 28 20 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a  f( pc>=usableSiz
8490: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
84a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
84b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
84c0: 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
84d0: 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70  Ptr(pPage, &temp
84e0: 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20  [pc]);.    cbrk 
84f0: 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  -= size;.    if(
8500: 20 63 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74   cbrk<cellOffset
8510: 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73  +2*nCell || pc+s
8520: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
8530: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8540: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8550: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
8560: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
8570: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
8580: 62 72 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65  brk>=0 );.    me
8590: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
85a0: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
85b0: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
85c0: 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20  (pAddr, cbrk);. 
85d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
85e0: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
85f0: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
8600: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8610: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
8620: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
8630: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
8640: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
8650: 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f  ;.  addr = cellO
8660: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20  ffset+2*nCell;. 
8670: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64   memset(&data[ad
8680: 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64  dr], 0, cbrk-add
8690: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  r);.  assert( sq
86a0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
86b0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
86c0: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
86d0: 62 72 6b 2d 61 64 64 72 21 3d 70 50 61 67 65 2d  brk-addr!=pPage-
86e0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
86f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8700: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
8710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
8730: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
8740: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
8750: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
8760: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
8770: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
8780: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
8790: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
87a0: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
87b0: 65 20 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65  e .** first byte
87c0: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
87d0: 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ace. .**.** The 
87e0: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
87f0: 73 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65  s that the space
8800: 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
8810: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66   of the cell-off
8820: 73 65 74 20 0a 2a 2a 20 61 72 72 61 79 20 61 6e  set .** array an
8830: 64 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  d the start of t
8840: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
8850: 61 72 65 61 20 69 73 20 61 74 20 6c 65 61 73 74  area is at least
8860: 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
8870: 69 6e 20 73 69 7a 65 2e 20 53 6f 20 74 68 69 73  in size. So this
8880: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6e 65 76   routine can nev
8890: 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49  er fail..**.** I
88a0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  f there are alre
88b0: 61 64 79 20 36 30 20 6f 72 20 6d 6f 72 65 20 62  ady 60 or more b
88c0: 79 74 65 73 20 6f 66 20 66 72 61 67 6d 65 6e 74  ytes of fragment
88d0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
88e0: 65 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 69  e,.** the page i
88f0: 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62  s defragmented b
8900: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
8910: 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f   If this were no
8920: 74 20 64 6f 6e 65 20 74 68 65 72 65 0a 2a 2a 20  t done there.** 
8930: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
8940: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
8950: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
8960: 63 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  could eventually
8970: 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 74 68   .** overflow th
8980: 65 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  e single-byte fi
8990: 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2d  eld of the page-
89a0: 68 65 61 64 65 72 20 69 6e 20 77 68 69 63 68 20  header in which 
89b0: 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
89c0: 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   stored..*/.stat
89d0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
89e0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
89f0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
8a00: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
8a10: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8a20: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
8a30: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
8a40: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
8a50: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
8a60: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
8a70: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
8a80: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
8a90: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ata */.  int nFr
8aa0: 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ag;             
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ac0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d   Number of fragm
8ad0: 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 70  ented bytes on p
8ae0: 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Page */.  int to
8af0: 70 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  p;.  .  assert( 
8b00: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8b10: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8b20: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8b30: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
8b40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8b50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8b60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8b70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
8b80: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
8b90: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
8ba0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
8bb0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
8bc0: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
8bd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
8be0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f  rflow==0 );..  /
8bf0: 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
8c00: 65 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  e space between 
8c10: 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20  the cell-offset 
8c20: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 0a 20  array and the . 
8c30: 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74   ** cell-content
8c40: 20 61 72 65 61 20 69 73 20 67 72 65 61 74 65 72   area is greater
8c50: 20 74 68 61 6e 20 6e 42 79 74 65 20 62 79 74 65   than nByte byte
8c60: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
8c70: 28 20 6e 42 79 74 65 20 3c 3d 20 28 0a 20 20 20  ( nByte <= (.   
8c80: 20 20 20 67 65 74 32 62 79 74 65 28 26 64 61 74     get2byte(&dat
8c90: 61 5b 68 64 72 2b 35 5d 29 2d 28 68 64 72 2b 38  a[hdr+5])-(hdr+8
8ca0: 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
8cb0: 34 29 2b 32 2a 67 65 74 32 62 79 74 65 28 26 64  4)+2*get2byte(&d
8cc0: 61 74 61 5b 68 64 72 2b 33 5d 29 29 0a 20 20 29  ata[hdr+3])).  )
8cd0: 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  );..  nFrag = da
8ce0: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
8cf0: 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20   nFrag>=60 ){.  
8d00: 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65    defragmentPage
8d10: 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  (pPage);.  }else
8d20: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
8d30: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
8d40: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
8d50: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
8d60: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
8d70: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
8d80: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
8d90: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
8da0: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
8db0: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
8dc0: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
8dd0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
8de0: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
8df0: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
8e00: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
8e10: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
8e20: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
8e30: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
8e40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
8e50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8e60: 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a  a[pc+2]);     /*
8e70: 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c   Size of free sl
8e80: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
8e90: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
8ea0: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73         int x = s
8eb0: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
8ec0: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
8ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
8ee0: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
8ef0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
8f00: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
8f10: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  er of.          
8f20: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
8f30: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
8f40: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
8f50: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
8f60: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
8f70: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
8f80: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38  ata[hdr+7] = (u8
8f90: 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20  )(nFrag + x);.  
8fa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8fb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
8fc0: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
8fd0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
8fe0: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
8ff0: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
9000: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
9010: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
9020: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
9030: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75   */.          pu
9040: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
9050: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  2], x);.        
9060: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
9070: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 7d   pc + x;.      }
9080: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9090: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
90a0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
90b0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
90c0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
90d0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
90e0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
90f0: 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74    */.  top = get
9100: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9110: 35 5d 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20 70  5]) - nByte;.  p
9120: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
9130: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65  r+5], top);.  re
9140: 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn top;.}../*.
9150: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
9160: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
9170: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
9180: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
9190: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
91a0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
91b0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
91c0: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
91d0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
91e0: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
91f0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
9200: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
9210: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
9220: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
9230: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
9240: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
9250: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
9260: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
9270: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
9280: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73  ge *pPage, int s
9290: 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b  tart, int size){
92a0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65  .  int addr, pbe
92b0: 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69  gin, hdr;.  unsi
92c0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
92d0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
92e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92f0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9310: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9320: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9330: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
9340: 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
9350: 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61  et+6+(pPage->lea
9360: 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65  f?0:4) );.  asse
9370: 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a  rt( (start + siz
9380: 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e)<=pPage->pBt->
9390: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
93a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
93b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
93c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
93d0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e  .  assert( size>
93e0: 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =0 );   /* Minim
93f0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
9400: 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
9410: 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
9420: 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  E.  /* Overwrite
9430: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
9440: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
9450: 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f  when the SECURE_
9460: 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74  DELETE .  ** opt
9470: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61  ion is enabled a
9480: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a  t compile-time *
9490: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  /.  memset(&data
94a0: 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  [start], 0, size
94b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
94c0: 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61  Add the space ba
94d0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ck into the link
94e0: 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  ed list of freeb
94f0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d  locks */.  hdr =
9500: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9510: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
9520: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
9530: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
9540: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
9550: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
9560: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9570: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
9580: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
9590: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67   );.    if( pbeg
95a0: 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20 20  in<=addr ) {.   
95b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
95c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
95d0: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
95e0: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  pbegin;.  }.  if
95f0: 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65 2d   ( pbegin>pPage-
9600: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9610: 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -4 ) {.    retur
9620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9630: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
9640: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
9650: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
9660: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
9670: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
9680: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
9690: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
96a0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
96b0: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
96c0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
96d0: 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72  ree = pPage->nFr
96e0: 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a  ee + (u16)size;.
96f0: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
9700: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
9710: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
9720: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9730: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
9740: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
9750: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
9760: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
9770: 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20  xt, psize, x;.  
9780: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
9790: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
97a0: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
97b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
97c0: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
97d0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
97e0: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
97f0: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
9800: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
9810: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
9820: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
9830: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
9840: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
9850: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
9860: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
9870: 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c        if( (frag<
9880: 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74  0) || (frag>(int
9890: 29 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  )data[pPage->hdr
98a0: 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20  Offset+7]) ){.  
98b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
98c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
98d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
98e0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
98f0: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29  ffset+7] -= (u8)
9900: 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20  frag;.      x = 
9910: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9920: 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75  next]);.      pu
9930: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
9940: 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  gin], x);.      
9950: 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32  x = pnext + get2
9960: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
9970: 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20  +2]) - pbegin;. 
9980: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
9990: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78  ata[pbegin+2], x
99a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
99b0: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
99c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
99d0: 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  /* If the cell c
99e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69  ontent area begi
99f0: 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c  ns with a freebl
9a00: 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20  ock, remove it. 
9a10: 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  */.  if( data[hd
9a20: 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35  r+1]==data[hdr+5
9a30: 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d  ] && data[hdr+2]
9a40: 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b  ==data[hdr+6] ){
9a50: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  .    int top;.  
9a60: 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62    pbegin = get2b
9a70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
9a80: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
9a90: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74  ata[hdr+1], &dat
9aa0: 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20  a[pbegin], 2);. 
9ab0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
9ac0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
9ad0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
9ae0: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
9af0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
9b00: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
9b10: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
9b20: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
9b30: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
9b40: 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
9b50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9b60: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
9b70: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
9b80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
9b90: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
9ba0: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
9bb0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
9bc0: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
9bd0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
9be0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
9bf0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
9c00: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
9c10: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
9c20: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
9c30: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
9c40: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
9c50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
9c60: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
9c70: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
9c80: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
9c90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
9ca0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
9cb0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
9cc0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
9cd0: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
9ce0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
9cf0: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
9d00: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9d10: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
9d20: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
9d30: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
9d40: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
9d50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9d60: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
9d70: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
9d80: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
9d90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9da0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
9dc0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
9dd0: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
9de0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
9df0: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
9e00: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
9e10: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
9e20: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
9e30: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
9e40: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
9e50: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
9e60: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
9e70: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
9e80: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
9e90: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
9ea0: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50  ge->hasData = pP
9eb0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
9ec0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
9ed0: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
9ee0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
9ef0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
9f00: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
9f10: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
9f20: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
9f30: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
9f40: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
9f50: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
9f60: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
9f70: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
9f80: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
9f90: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
9fa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9fb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9fc0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
9fd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9fe0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
9ff0: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
a000: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
a010: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
a020: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
a030: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
a040: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
a050: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
a060: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
a070: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
a080: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
a090: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
a0a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
a0b0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
a0c0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
a0d0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
a0e0: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
a0f0: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
a100: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
a110: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
a120: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
a130: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
a140: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
a150: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
a160: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
a170: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a180: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a190: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a1a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a1b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a1c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
a1d0: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
a1e0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
a1f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
a200: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
a210: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
a220: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
a230: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
a240: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
a250: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
a260: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
a270: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
a280: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
a290: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
a2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
a2b0: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
a2c0: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
a2d0: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
a2e0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
a2f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a300: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
a310: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
a320: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
a330: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
a340: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
a350: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
a360: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
a370: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
a380: 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ture */.    u16 
a390: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
a3a0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
a3b0: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
a3c0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
a3d0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
a3e0: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
a3f0: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
a400: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
a410: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46  er */.    u16 nF
a420: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
a430: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
a440: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
a450: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f  ge */.    u16 to
a460: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
a470: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
a480: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
a490: 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  rea */..    pBt 
a4a0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
a4b0: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
a4c0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
a4d0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
a4e0: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
a4f0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
a500: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
a510: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a520: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
a530: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
a540: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
a550: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
a560: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
a570: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
a580: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70  eSize - 1;.    p
a590: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
a5a0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
a5b0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
a5c0: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
a5d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
a5e0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
a5f0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
a600: 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20  leaf;.    top = 
a610: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a620: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
a630: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
a640: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
a650: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
a660: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
a670: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
a680: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
a690: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
a6a0: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
a6b0: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
a6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a6d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a6e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
a6f0: 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
a700: 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
a710: 61 75 73 65 20 75 73 65 20 74 6f 20 72 65 61 64  ause use to read
a720: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
a730: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
a740: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
a750: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
a760: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
a770: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
a780: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
a790: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
a7a0: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
a7b0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
a7c0: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
a7d0: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
a7e0: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
a7f0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
a800: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 23  t does..    */.#
a810: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a820: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
a830: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
a840: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43    {.      int iC
a850: 65 6c 6c 46 69 72 73 74 3b 20 20 20 2f 2a 20 46  ellFirst;   /* F
a860: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
a870: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ell index */.   
a880: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74     int iCellLast
a890: 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73  ;    /* Last pos
a8a0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
a8b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a8d0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
a8e0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
a8f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
a900: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
a910: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
a920: 0a 0a 20 20 20 20 20 20 69 43 65 6c 6c 46 69 72  ..      iCellFir
a930: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
a940: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
a950: 3b 0a 20 20 20 20 20 20 69 43 65 6c 6c 4c 61 73  ;.      iCellLas
a960: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
a970: 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   4;.      if( !p
a980: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
a990: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
a9a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
a9b0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
a9c0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
a9d0: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
a9e0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
a9f0: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
aa00: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
aa10: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
aa20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aa40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aa50: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
aa60: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
aa70: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pc]);.        if
aa80: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
aa90: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
aaa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
aab0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
aac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aad0: 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20    }  .#endif..  
aae0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
aaf0: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
ab00: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
ab10: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
ab20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
ab30: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
ab40: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
ab50: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30  .    while( pc>0
ab60: 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65   ){.      u16 ne
ab70: 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  xt, size;.      
ab80: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
ab90: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e-4 ){.        /
aba0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  * Free block is 
abb0: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
abc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
abd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
abe0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
abf0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
ac00: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
ac10: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
ac20: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
ac30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78  );.      if( nex
ac40: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
ac50: 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20  size+3 ){.      
ac60: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
ac70: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65   must be in acce
ac80: 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
ac90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
aca0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
acb0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
acc0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
acd0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
ace0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
acf0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
ad00: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
ad10: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
ad20: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
ad30: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
ad40: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
ad50: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
ad60: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
ad70: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
ad80: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
ad90: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
ada0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
adb0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
adc0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
add0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
ade0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
adf0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
ae00: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
ae10: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
ae20: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
ae30: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
ae40: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
ae50: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
ae60: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
ae70: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
ae80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
ae90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
aea0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
aeb0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
aec0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aed0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
aee0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
aef0: 20 6e 46 72 65 65 20 2d 20 28 63 65 6c 6c 4f 66   nFree - (cellOf
af00: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
af10: 6e 43 65 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a 20  nCell);..#if 0. 
af20: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61   /* Check that a
af30: 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20 69  ll the offsets i
af40: 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65  n the cell offse
af50: 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74 68  t array are with
af60: 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20  in range. .  ** 
af70: 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74  .  ** Omitting t
af80: 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  his consistency 
af90: 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20  check and using 
afa0: 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  the pPage->maskP
afb0: 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f  age mask.  ** to
afc0: 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e   prevent overrun
afd0: 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62 75  ning the page bu
afe0: 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c  ffer in findCell
aff0: 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a  () results in a.
b000: 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72    ** 2.5% perfor
b010: 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f  mance gain..  */
b020: 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66  .  {.    u8 *pOf
b030: 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65  f;        /* Ite
b040: 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68  rator used to ch
b050: 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66  eck all cell off
b060: 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67  sets are in rang
b070: 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e  e */.    u8 *pEn
b080: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  d;        /* Poi
b090: 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63  nter to end of c
b0a0: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
b0b0: 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b   */.    u8 mask;
b0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
b0d0: 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d 75   of bits that mu
b0e0: 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53  st be zero in MS
b0f0: 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  B of cell offset
b100: 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20  s */.    mask = 
b110: 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67  ~(((u8)(pBt->pag
b120: 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20  eSize>>8))-1);. 
b130: 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b     pEnd = &data[
b140: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61  cellOffset + pPa
b150: 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  ge->nCell*2];.  
b160: 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61    for(pOff=&data
b170: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f  [cellOffset]; pO
b180: 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a  ff!=pEnd && !((*
b190: 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66  pOff)&mask); pOf
b1a0: 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70  f+=2);.    if( p
b1b0: 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Off!=pEnd ){.   
b1c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b1d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b1e0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
b1f0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
b200: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
b210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b220: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
b230: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
b240: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
b250: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
b260: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
b270: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
b280: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
b290: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b2a0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
b2b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
b2c0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b2d0: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
b2e0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
b2f0: 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
b300: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
b310: 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
b320: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b330: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
b340: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
b350: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
b360: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b370: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
b380: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
b390: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
b3a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b3b0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
b3c0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
b3d0: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
b3e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b3f0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b400: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b410: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b420: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
b430: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73  tex) );.  /*mems
b440: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
b450: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
b460: 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61  e - hdr);*/.  da
b470: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
b480: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
b490: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
b4a0: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
b4b0: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
b4c0: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
b4d0: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
b4e0: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
b4f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b500: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
b510: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
b520: 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ree = pBt->usabl
b530: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20  eSize - first;. 
b540: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
b550: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
b560: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
b570: 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63   hdr;.  pPage->c
b580: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
b590: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  t;.  pPage->nOve
b5a0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
b5b0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
b5c0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
b5d0: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
b5e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
b5f0: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Page = pBt->page
b600: 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67  Size - 1;.  pPag
b610: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
b620: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
b630: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
b640: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
b650: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
b660: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
b670: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
b680: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
b690: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
b6a0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
b6b0: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
b6c0: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
b6d0: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
b6e0: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
b6f0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
b700: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
b710: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
b720: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
b730: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b740: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
b750: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
b760: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
b770: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
b780: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
b790: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
b7a0: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
b7b0: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
b7c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
b7d0: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
b7e0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
b7f0: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
b800: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
b810: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
b820: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
b830: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
b840: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
b850: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
b860: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b870: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
b880: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
b890: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
b8a0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
b8b0: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
b8c0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
b8d0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
b8e0: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
b8f0: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
b900: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
b910: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
b920: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
b930: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
b940: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
b950: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
b960: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
b970: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
b980: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
b990: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
b9a0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
b9b0: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
b9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
b9d0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
b9e0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
b9f0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
ba00: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
ba10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba20: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
ba30: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
ba40: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
ba50: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
ba60: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
ba70: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
ba80: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
ba90: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
baa0: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
bab0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
bac0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
bad0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
bae0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
baf0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
bb00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
bb10: 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
bb20: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
bb30: 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
bb40: 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
bb50: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
bb60: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
bb70: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
bb80: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
bb90: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
bba0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bbb0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
bbc0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
bbd0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
bbe0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
bbf0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
bc00: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
bc10: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
bc20: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
bc30: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
bc40: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
bc50: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
bc60: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
bc70: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
bc80: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
bc90: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
bca0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
bcb0: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
bcc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
bcd0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
bce0: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
bcf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
bd00: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
bd10: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
bd20: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
bd30: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
bd40: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
bd50: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
bd60: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
bd70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
bd80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
bd90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
bda0: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
bdb0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
bdc0: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
bdd0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
bde0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
bdf0: 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
be00: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
be10: 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31    int nPage = -1
be20: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
be30: 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
be40: 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 );.  rc = sqli
be50: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
be60: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
be70: 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  nPage);.  assert
be80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
be90: 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a  || nPage==-1 );.
bea0: 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e    return (Pgno)n
beb0: 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Page;.}../*.** G
bec0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
bed0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
bee0: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
bef0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
bf00: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
bf10: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
bf20: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
bf30: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
bf40: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
bf50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
bf60: 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  tPage()..*/.stat
bf70: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
bf80: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
bf90: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
bfa0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
bfb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
bfc0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
bfd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
bfe0: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
bff0: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
c000: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
c010: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
c020: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
c030: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
c040: 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
c050: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c060: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
c070: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ) );.  if( pgno=
c080: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c090: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c0a0: 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a  BKPT; .  }..  /*
c0b0: 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65   It is often the
c0c0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70   case that the p
c0d0: 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61  age we want is a
c0e0: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
c0f0: 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74  .  ** If so, get
c100: 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54   it directly.  T
c110: 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f  his saves us fro
c120: 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c  m having to call
c130: 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63  .  ** pagerPagec
c140: 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73  ount() to make s
c150: 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68  ure pgno is with
c160: 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68  in limits, which
c170: 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e   results.  ** in
c180: 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70   a measureable p
c190: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
c1a0: 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  vements..  */.  
c1b0: 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 20  *ppPage = pPage 
c1c0: 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
c1d0: 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  p(pBt, pgno);.  
c1e0: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
c1f0: 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65   /* Page is alre
c200: 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  ady in cache */.
c210: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c220: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
c230: 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20   /* Page not in 
c240: 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65 20  cache.  Acquire 
c250: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
c260: 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
c270: 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
c280: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c290: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c2a0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
c2b0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
c2c0: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
c2d0: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
c2e0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c2f0: 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50      pPage = *ppP
c300: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  age;.  }.  if( !
c310: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
c320: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c330: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
c340: 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
c350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c360: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
c370: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  e(pPage);.    *p
c380: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
c390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c3a0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
c3b0: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
c3c0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
c3d0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
c3e0: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  or.** call to sq
c3f0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
c400: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c410: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
c420: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
c430: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
c440: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c450: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
c460: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
c470: 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d  eRefcount(pPage-
c480: 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20  >pDbPage)>1 );. 
c490: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
c4a0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
c4b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
c4c0: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
c4d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c4e0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c4f0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c500: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73  pPage );.    ass
c510: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c520: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
c530: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
c540: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
c550: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c560: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
c570: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c580: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
c590: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
c5a0: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
c5b0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
c5c0: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
c5d0: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
c5e0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
c5f0: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
c600: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
c610: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
c620: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
c630: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c640: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
c650: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
c660: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
c670: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c680: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c690: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
c6a0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
c6b0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
c6c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
c6d0: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
c6e0: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
c6f0: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
c700: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
c710: 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
c720: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
c730: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
c740: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
c750: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
c760: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
c770: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
c780: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
c790: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
c7a0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
c7b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c7c0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
c7d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c7e0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
c7f0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
c800: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
c810: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
c820: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
c830: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
c840: 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
c850: 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
c860: 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
c870: 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
c880: 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
c890: 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
c8a0: 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
c8b0: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
c8c0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  to sqlite3BtreeI
c8d0: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
c8e0: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
c8f0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
c900: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
c910: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
c920: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
c930: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
c940: 74 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  t.      ** sqlit
c950: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
c960: 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
c970: 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
c980: 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
c990: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
c9a0: 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
c9b0: 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
c9c0: 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
c9d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
c9e0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
c9f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ca00: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
ca10: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
ca20: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
ca30: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
ca40: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
ca50: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
ca60: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
ca70: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
ca80: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
ca90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
caa0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cab0: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
cac0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
cad0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
cae0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
caf0: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
cb00: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
cb10: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
cb20: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
cb30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
cb40: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
cb50: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
cb60: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
cb70: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
cb80: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
cb90: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
cba0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
cbb0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
cbc0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
cbd0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
cbe0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
cbf0: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
cc00: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
cc10: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
cc20: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
cc30: 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
cc40: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
cc50: 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
cc60: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
cc70: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
cc80: 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
cc90: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
cca0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ccb0: 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
ccc0: 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
ccd0: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
cce0: 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
ccf0: 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
cd00: 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
cd10: 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
cd20: 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
cd30: 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
cd40: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
cd50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
cd60: 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
cd70: 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
cd80: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
cd90: 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
cda0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
cdb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cdc0: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
cdd0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
cde0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
cdf0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
ce00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
ce10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
ce20: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
ce30: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
ce40: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
ce50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
ce60: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
ce70: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
ce80: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cea0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
ceb0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
cec0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
ced0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
cee0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
cef0: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
cf00: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cf20: 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  he VFS to use fo
cf30: 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  r this btree */.
cf40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
cf50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
cf60: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
cf70: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
cf80: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
cf90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfa0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
cfb0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
cfc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
cfd0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
cfe0: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
cff0: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
d000: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
d010: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d020: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
d030: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
d040: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
d050: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
d060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d070: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
d080: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
d090: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
d0a0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
d0b0: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
d0c0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
d0d0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
d0e0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
d0f0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
d100: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
d110: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
d120: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
d130: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
d140: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
d150: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
d160: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
d170: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
d180: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
d190: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
d1a0: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
d1b0: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
d1c0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
d1d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d1e0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
d1f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d200: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d210: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
d220: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
d230: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
d240: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
d250: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
d260: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
d270: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
d280: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
d290: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
d2a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
d2b0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
d2c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d2d0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
d2e0: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
d2f0: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
d300: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
d310: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
d320: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
d330: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d340: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
d350: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
d360: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
d370: 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
d380: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
d390: 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
d3a0: 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
d3b0: 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
d3c0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
d3d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d3e0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
d3f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
d400: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
d410: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
d420: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
d430: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
d440: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
d450: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
d460: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
d470: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
d480: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
d490: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  */.  if( isMemdb
d4a0: 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ==0 && zFilename
d4b0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
d4c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
d4d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
d4e0: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
d4f0: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
d500: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
d510: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
d520: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
d530: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
d540: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
d550: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
d560: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
d570: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
d580: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
d590: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d  e = 1;.      db-
d5a0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
d5b0: 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20  _SharedCache;.  
d5c0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
d5d0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
d5e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d5f0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
d600: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d620: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
d630: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
d640: 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61  ame, nFullPathna
d650: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
d660: 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 4f  e);.      mutexO
d670: 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  pen = sqlite3Mut
d680: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
d690: 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e  UTEX_STATIC_OPEN
d6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d6b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
d6c0: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d  exOpen);.      m
d6d0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
d6e0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
d6f0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
d700: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
d710: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d720: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
d730: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42  d);.      for(pB
d740: 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
d750: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
d760: 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
d770: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
d780: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d790: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
d7a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
d7b0: 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
d7c0: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
d7d0: 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
d7e0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
d7f0: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
d800: 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
d810: 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
d820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d830: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
d840: 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
d850: 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
d860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
d870: 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
d880: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
d890: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
d8a0: 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
d8b0: 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
d8c0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
d8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
d8e0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
d8f0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
d900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
d910: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
d920: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
d930: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d940: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
d950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d960: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
d980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
d990: 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
d9a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d9b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
d9c0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
d9d0: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
d9e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
d9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
da00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
da10: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
da20: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
da30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
da40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
da50: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
da60: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
da70: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
da80: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
da90: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
daa0: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
dab0: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
dac0: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
dad0: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
dae0: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
daf0: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
db00: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
db10: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
db20: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
db30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
db40: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
db50: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
db60: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
db70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
db80: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
db90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
dba0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
dbb0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
dbc0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
dbd0: 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
dbe0: 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
dbf0: 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
dc00: 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
dc10: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
dc20: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
dc30: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
dc40: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
dc50: 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
dc60: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
dc70: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
dc80: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
dc90: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
dca0: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
dcb0: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
dcc0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
dcd0: 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
dce0: 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
dcf0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
dd00: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
dd10: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
dd20: 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
dd30: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
dd40: 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
dd50: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
dd60: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
dd70: 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
dd80: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
dd90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
dda0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
ddb0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
ddc0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
ddd0: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
dde0: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
ddf0: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
de20: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
de30: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
de40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
de50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
de60: 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
de70: 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
de80: 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
de90: 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
dea0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
deb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dec0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
ded0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
dee0: 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b     pBt->db = db;
def0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
df00: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
df10: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
df20: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
df30: 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
df40: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
df50: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
df60: 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d  SetReiniter(pBt-
df70: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69  >pPager, pageRei
df80: 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  nit);.    pBt->p
df90: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
dfa0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
dfb0: 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  .    pBt->readOn
dfc0: 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ly = sqlite3Page
dfd0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
dfe0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
dff0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65  t->pageSize = ge
e000: 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t2byte(&zDbHeade
e010: 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  r[16]);.    if( 
e020: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
e030: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
e040: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
e050: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
e060: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
e070: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
e080: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
e090: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
e0a0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
e0b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e0c0: 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
e0d0: 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
e0e0: 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
e0f0: 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
e100: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
e110: 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
e120: 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
e130: 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
e140: 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
e150: 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
e160: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
e170: 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
e180: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
e190: 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
e1a0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
e1b0: 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
e1c0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
e1d0: 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
e1e0: 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
e1f0: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
e200: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
e210: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
e220: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
e230: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
e240: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
e250: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
e260: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
e270: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
e280: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
e290: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
e2a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
e2b0: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
e2c0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e2d0: 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
e2e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
e2f0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
e300: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e310: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
e320: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
e330: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
e340: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
e350: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e360: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
e370: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e380: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
e390: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
e3a0: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
e3b0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
e3c0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
e3d0: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
e3e0: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
e3f0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
e400: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
e410: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
e420: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
e430: 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
e440: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
e450: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
e460: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
e470: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
e480: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
e490: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
e4a0: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
e4b0: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
e4c0: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
e4d0: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
e4e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e4f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e500: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
e510: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
e520: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
e530: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
e540: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
e550: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
e560: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
e570: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
e580: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
e590: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e5a0: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
e5b0: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
e5c0: 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53   1;.      mutexS
e5d0: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
e5e0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
e5f0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
e600: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28  STER);.      if(
e610: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
e620: 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
e630: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
e640: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
e650: 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
e660: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
e670: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
e680: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
e690: 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
e6a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
e6b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e6c0: 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
e6d0: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
e6e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
e6f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e700: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e710: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e720: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
e730: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
e740: 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
e750: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
e760: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
e770: 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
e780: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
e790: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
e7a0: 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
e7b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e7c0: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
e7d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e7e0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
e7f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
e800: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
e810: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e820: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
e830: 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
e840: 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
e850: 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
e860: 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
e870: 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
e880: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
e890: 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
e8a0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
e8b0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
e8c0: 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
e8d0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
e8e0: 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
e8f0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
e900: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
e910: 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
e920: 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
e930: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
e940: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
e950: 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
e960: 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
e970: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
e980: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
e990: 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
e9a0: 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
e9b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
e9c0: 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
e9d0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
e9e0: 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
e9f0: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
ea00: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
ea10: 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
ea20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ea30: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
ea40: 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
ea50: 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
ea60: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
ea70: 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
ea80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
ea90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
eaa0: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
eab0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
eac0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
ead0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
eae0: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
eaf0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
eb00: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
eb10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
eb20: 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
eb30: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
eb40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eb50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
eb60: 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
eb70: 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
eb80: 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
eb90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eba0: 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
ebb0: 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
ebc0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
ebd0: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
ebe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ebf0: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
ec00: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ec10: 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
ec20: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
ec30: 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
ec40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ec50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
ec60: 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
ec70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ec80: 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
ec90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
eca0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
ecb0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
ecc0: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
ecd0: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
ece0: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
ecf0: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
ed00: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
ed10: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
ed20: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
ed30: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
ed40: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
ed50: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
ed60: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
ed70: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
ed80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ed90: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
eda0: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
edb0: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
edc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
edd0: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
ede0: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
edf0: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
ee00: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
ee10: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
ee20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ee30: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
ee40: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
ee50: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
ee60: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
ee70: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
ee80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
ee90: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
eea0: 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
eeb0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
eec0: 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
eed0: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
eee0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
eef0: 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
ef00: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
ef10: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
ef20: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
ef30: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
ef40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
ef50: 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
ef60: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
ef70: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
ef80: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
ef90: 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
efa0: 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
efb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
efc0: 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
efd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
efe0: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
eff0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
f000: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
f010: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
f020: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
f030: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
f040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
f050: 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
f060: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
f070: 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
f080: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
f090: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
f0a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
f0b0: 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
f0c0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
f0d0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
f0e0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
f0f0: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
f100: 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
f110: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
f120: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
f130: 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
f140: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
f150: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
f160: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
f170: 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
f180: 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
f190: 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
f1a0: 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a  geSize );.  }.}.
f1b0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
f1c0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
f1d0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
f1e0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
f1f0: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
f200: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
f210: 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
f220: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
f230: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
f240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f250: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
f260: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
f270: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
f280: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f290: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
f2a0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f2b0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
f2c0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
f2d0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
f2e0: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
f2f0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
f300: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f310: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
f320: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
f330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
f340: 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
f350: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
f360: 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
f370: 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
f380: 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
f390: 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
f3a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
f3b0: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
f3c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
f3d0: 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
f3e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f3f0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
f400: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
f410: 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
f420: 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
f430: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
f440: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
f450: 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
f460: 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
f470: 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
f480: 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
f490: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
f4a0: 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74  back(p);.  sqlit
f4b0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
f4c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
f4d0: 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
f4e0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
f4f0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
f500: 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
f510: 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
f520: 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
f530: 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
f540: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
f550: 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
f560: 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
f570: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
f580: 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
f590: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
f5a0: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
f5b0: 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
f5c0: 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
f5d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
f5e0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
f5f0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
f600: 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
f610: 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
f620: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
f630: 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
f640: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
f650: 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
f660: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
f670: 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
f680: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
f690: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
f6a0: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
f6b0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
f6c0: 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
f6d0: 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
f6e0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
f6f0: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
f700: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
f710: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f720: 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68  3_free(pBt->pSch
f730: 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
f740: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
f750: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f760: 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
f770: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f780: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
f790: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
f7a0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
f7b0: 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
f7c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
f7d0: 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
f7e0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
f7f0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
f800: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
f810: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
f820: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
f830: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
f840: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f850: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
f860: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
f870: 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
f880: 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
f890: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
f8a0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
f8b0: 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
f8c0: 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
f8d0: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
f8e0: 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
f8f0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
f900: 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
f910: 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
f920: 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
f930: 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
f940: 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
f950: 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
f960: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
f970: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
f980: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
f990: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
f9a0: 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
f9b0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
f9c0: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
f9d0: 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
f9e0: 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
f9f0: 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
fa00: 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
fa10: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
fa20: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
fa30: 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
fa40: 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
fa50: 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
fa60: 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
fa70: 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
fa80: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
fa90: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
faa0: 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
fab0: 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
fac0: 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
fad0: 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
fae0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
faf0: 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
fb00: 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
fb10: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
fb20: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
fb30: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
fb40: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fb50: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
fb60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fb70: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
fb80: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
fb90: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
fba0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
fbb0: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
fbc0: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
fbd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
fbe0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
fbf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fc00: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
fc10: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
fc20: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
fc30: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
fc40: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
fc50: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
fc60: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
fc70: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
fc80: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
fc90: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
fca0: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
fcb0: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
fcc0: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
fcd0: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
fce0: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
fcf0: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
fd00: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
fd10: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
fd20: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
fd30: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
fd40: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
fd50: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
fd60: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
fd70: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
fd80: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
fd90: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
fda0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
fdb0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
fdc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
fdd0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
fde0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
fdf0: 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
fe00: 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
fe10: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
fe20: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fe30: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
fe40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fe50: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
fe60: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
fe70: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
fe80: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
fe90: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
fea0: 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
feb0: 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71   fullSync);.  sq
fec0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
fed0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
fee0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
fef0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
ff00: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
ff10: 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
ff20: 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
ff30: 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
ff40: 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
ff50: 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
ff60: 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
ff70: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
ff80: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
ff90: 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
ffa0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
ffb0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
ffc0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
ffd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ffe0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
fff0: 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
10000 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10010 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
10020 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
10030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10040 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
10050 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
10060 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10070 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
10080 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10090 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
100a0 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
100b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
100c0 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61  ACUUM)./*.** Cha
100d0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
100e0 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
100f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
10100 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
10110 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
10120 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
10130 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
10140 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
10150 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
10160 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
10170 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
10180 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
10190 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
101a0 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
101b0 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
101c0 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
101d0 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
101e0 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
101f0 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
10200 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
10210 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
10220 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
10230 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
10240 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
10250 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
10260 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
10270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
10280 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
10290 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
102a0 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
102b0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
102c0 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
102d0 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
102e0 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
102f0 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
10300 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
10310 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
10320 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
10330 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
10340 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
10350 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
10360 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
10370 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
10380 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
10390 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
103a0 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20  eSizeFixed flag 
103b0 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
103c0 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
103d0 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
103e0 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
103f0 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
10400 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10410 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
10420 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
10430 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
10440 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
10450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10460 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
10470 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10480 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
10490 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
104a0 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
104b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
104c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
104d0 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
104e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
104f0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
10500 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
10510 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
10520 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
10530 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
10540 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
10550 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
10560 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
10570 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
10580 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
10590 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
105a0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
105b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
105c0 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
105d0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
105e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
105f0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
10600 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
10610 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
10620 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
10630 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
10640 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
10650 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
10660 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
10670 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10680 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
10690 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
106a0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
106b0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
106c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
106d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
106e0 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
106f0 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
10700 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
10710 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   1;.  sqlite3Btr
10720 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10740 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
10750 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
10760 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
10770 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
10780 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
10790 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
107a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
107b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
107c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
107d0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
107e0 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
107f0 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
10800 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
10810 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
10820 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
10830 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
10840 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
10850 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
10860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10870 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
10880 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
10890 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
108a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
108b0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
108c0 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
108d0 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
108e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
108f0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
10900 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
10910 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
10920 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
10930 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
10940 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
10950 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
10960 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
10970 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
10980 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
10990 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
109a0 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
109b0 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
109c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
109d0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
109e0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
109f0 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
10a00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10a10 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
10a20 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
10a30 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
10a40 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
10a50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10a60 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
10a70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
10a80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10a90 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
10aa0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
10ab0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
10ac0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
10ad0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
10ae0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
10af0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
10b00 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
10b10 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
10b20 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
10b30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
10b40 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
10b50 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
10b60 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
10b70 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
10b80 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
10b90 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
10ba0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
10bb0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
10bc0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
10bd0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
10be0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
10bf0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
10c00 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
10c10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10c20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
10c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
10c40 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
10c50 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10c60 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
10c70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
10c80 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
10c90 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
10ca0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10cb0 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
10cc0 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
10cd0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
10ce0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
10cf0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
10d00 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
10d10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10d20 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
10d30 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
10d40 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
10d50 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
10d60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
10d70 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
10d80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
10d90 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
10da0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
10db0 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
10dc0 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
10dd0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
10de0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
10df0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10e00 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
10e10 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
10e20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10e30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
10e40 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
10e50 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
10e60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10e70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10e80 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
10e90 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
10ea0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
10eb0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
10ec0 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
10ed0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
10ee0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
10ef0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
10f00 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
10f10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10f20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
10f30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
10f40 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
10f50 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
10f60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10f70 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
10f80 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
10f90 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
10fa0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
10fb0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10fc0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
10fd0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
10fe0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
10ff0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
11000 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
11010 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
11020 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
11030 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
11040 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
11050 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
11060 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
11070 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
11080 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
11090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
110a0 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
110b0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
110c0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
110d0 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67  age1;.  int nPag
110e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
110f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11100 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11110 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
11120 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
11130 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
11140 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
11150 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
11160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11170 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
11180 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
11190 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
111a0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
111b0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
111c0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
111d0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
111e0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
111f0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
11200 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
11210 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
11220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11230 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11240 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20  failed;.  }else 
11250 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
11260 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b     int pageSize;
11270 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
11280 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
11290 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
112a0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
112b0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
112c0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
112d0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
112e0 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
112f0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11300 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
11310 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
11320 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
11330 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
11340 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
11350 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
11360 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11370 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
11380 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
11390 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  um embedded frac
113a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61  tion must be exa
113b0 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74  ctly 25%.  And t
113c0 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  he minimum.    *
113d0 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  * embedded fract
113e0 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35  ion must be 12.5
113f0 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d  % for both leaf-
11400 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61  data and non-lea
11410 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54  f-data..    ** T
11420 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
11430 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
11440 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
11450 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
11460 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
11470 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
11480 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
11490 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
114a0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
114b0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
114c0 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
114d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
114e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
114f0 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
11500 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
11510 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
11520 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
11530 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
11540 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20  <512 ||.        
11550 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  (SQLITE_MAX_PAGE
11560 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70  _SIZE<32768 && p
11570 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
11580 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20  AX_PAGE_SIZE).  
11590 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
115a0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
115b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
115c0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
115d0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
115e0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
115f0 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
11600 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a  .    if( pageSiz
11610 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
11620 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
11630 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
11640 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
11650 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
11660 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
11670 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
11680 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
11690 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
116a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
116b0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
116c0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
116d0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
116e0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
116f0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
11700 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
11710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
11720 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
11730 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
11740 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
11750 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
11760 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
11770 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
11780 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
11790 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
117a0 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
117b0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
117c0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
117d0 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
117e0 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
117f0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
11800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11810 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
11820 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
11830 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
11860 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
11870 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
11880 20 29 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e   ) goto page1_in
11890 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
118a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
118b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
118c0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
118d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
118e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
118f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
11900 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
11910 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
11920 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
11930 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
11940 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11950 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11960 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
11970 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
11980 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
11990 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
119a0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
119b0 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
119c0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
119d0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
119e0 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
119f0 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
11a00 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
11a10 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
11a20 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
11a30 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
11a40 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
11a50 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
11a60 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
11a70 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
11a80 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
11a90 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
11aa0 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
11ab0 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
11ac0 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
11ad0 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
11ae0 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
11af0 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
11b00 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
11b10 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
11b20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
11b30 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
11b40 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
11b50 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
11b60 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
11b70 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
11b80 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
11b90 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
11ba0 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
11bb0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
11bc0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
11bd0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
11be0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
11bf0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
11c00 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
11c10 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
11c20 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
11c30 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
11c40 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
11c50 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
11c60 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
11c70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
11c80 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
11c90 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
11ca0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
11cb0 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
11cc0 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
11cd0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
11ce0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
11cf0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
11d00 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
11d10 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
11d20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
11d30 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
11d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
11d50 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
11d60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
11d70 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
11d80 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
11d90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
11da0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
11db0 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
11dc0 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
11dd0 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
11de0 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
11df0 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
11e00 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
11e10 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
11e20 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
11e30 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
11e40 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
11e50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11e60 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
11e70 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
11e80 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
11e90 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
11ea0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
11eb0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
11ec0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11ed0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11ee0 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
11ef0 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
11f00 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
11f10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11f20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11f30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11f40 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
11f50 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
11f60 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
11f70 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
11f80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11f90 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
11fa0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
11fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
11fc0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
11fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
11fe0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
11ff0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
12000 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12010 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
12020 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65  Data );.    rele
12030 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
12040 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge1);.    pBt->p
12050 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Page1 = 0;.  }.}
12060 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
12070 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79   new database by
12080 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
12090 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
120a0 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  the.** file..*/.
120b0 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
120c0 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
120d0 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
120e0 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
120f0 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
12100 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50  int rc;.  int nP
12110 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
12120 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12130 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12140 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12150 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12160 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
12170 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
12180 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
12190 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
121a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20  n rc;.  }.  pP1 
121b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
121c0 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
121d0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
121e0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
121f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
12200 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
12210 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12220 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
12230 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
12240 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
12250 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
12260 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
12270 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
12280 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
12290 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
122a0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
122b0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
122c0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
122d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
122e0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
122f0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
12300 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
12310 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
12320 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
12330 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
12340 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
12350 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
12360 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
12370 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
12380 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
12390 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
123a0 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
123b0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
123c0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
123d0 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
123e0 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
123f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12400 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
12410 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
12420 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
12430 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
12440 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12450 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
12460 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12470 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
12480 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
12490 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
124a0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
124b0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
124c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
124d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
124e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
124f0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
12500 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
12510 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
12520 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
12530 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
12540 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12550 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
12560 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
12570 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
12580 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
12590 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
125a0 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
125b0 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
125c0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
125d0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
125e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
125f0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
12600 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
12610 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
12620 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
12630 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
12640 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
12650 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
12660 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
12670 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
12680 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
12690 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
126a0 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
126b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
126c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
126d0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
126e0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
126f0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
12700 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12710 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
12720 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
12730 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
12740 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
12750 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
12760 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
12770 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
12780 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
12790 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
127a0 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
127b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
127c0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
127d0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
127e0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
127f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
12800 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
12810 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12820 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
12830 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
12840 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
12850 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
12860 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
12870 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
12880 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
12890 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
128a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
128b0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
128c0 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
128d0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
128e0 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
128f0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
12900 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
12910 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
12920 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
12930 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
12940 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
12950 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
12960 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
12970 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
12980 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
12990 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
129a0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
129b0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
129c0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
129d0 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
129e0 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
129f0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
12a00 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
12a10 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
12a20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
12a30 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
12a40 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
12a50 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
12a60 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
12a70 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
12a80 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
12a90 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
12aa0 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
12ab0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
12ac0 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
12ad0 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
12ae0 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
12af0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
12b00 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
12b10 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
12b20 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
12b30 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
12b40 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
12b50 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
12b60 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
12b70 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
12b80 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
12b90 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
12ba0 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
12bb0 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
12bc0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
12bd0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12be0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
12bf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12c00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12c10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
12c20 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
12c30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
12c40 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
12c50 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
12c60 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
12c70 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
12c80 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
12c90 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
12ca0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
12cb0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
12cc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
12cd0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
12ce0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
12cf0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
12d00 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
12d10 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
12d20 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
12d30 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
12d40 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
12d50 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
12d60 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
12d70 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
12d80 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
12d90 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
12da0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
12db0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
12dc0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
12dd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12de0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
12df0 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
12e00 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12e10 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
12e20 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
12e30 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
12e40 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
12e50 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
12e60 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
12e70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
12e80 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
12e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
12ea0 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
12eb0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
12ec0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
12ed0 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
12ee0 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
12ef0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
12f00 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
12f10 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
12f20 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
12f30 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
12f40 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
12f50 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
12f60 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
12f70 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
12f80 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
12f90 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
12fa0 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
12fb0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
12fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12fd0 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
12fe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
12ff0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
13000 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
13010 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13020 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
13030 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
13040 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
13050 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
13060 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
13070 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
13080 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
13090 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
130a0 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
130b0 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
130c0 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
130d0 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
130e0 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
130f0 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
13100 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
13110 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 69 66   opened. */.  if
13120 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
13130 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
13140 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
13150 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
13160 44 5f 4c 4f 43 4b 29 29 20 29 7b 0a 20 20 20 20  D_LOCK)) ){.    
13170 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
13180 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20  ;.  }..  do {.  
13190 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
131a0 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
131b0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
131c0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
131d0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
131e0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
131f0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
13200 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
13210 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
13220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13230 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
13240 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
13250 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
13260 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
13270 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
13280 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
13290 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
132a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
132b0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
132c0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
132d0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
132e0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
132f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
13300 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
13310 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
13320 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
13330 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
13340 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
13350 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
13360 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
13370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13380 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
13390 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
133a0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
133b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
133c0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
133d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
133e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
133f0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
13400 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
13410 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
13420 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
13430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
13450 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
13460 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
13470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
13480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
134a0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
134b0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
134c0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
134d0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
134e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
134f0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
13500 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
13510 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
13520 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
13530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13540 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
13550 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
13560 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
13570 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
13580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13590 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
135a0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
135b0 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d  e ){..assert( p-
135c0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
135d0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
135e0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
135f0 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
13600 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
13610 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
13620 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
13630 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
13640 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
13650 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13660 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
13670 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
13680 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
13690 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
136a0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
136b0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
136c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
136d0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
136e0 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  ans;.    }.#ifnd
136f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13700 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
13710 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
13720 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
13730 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
13740 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
13750 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
13760 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75  isExclusive = (u
13770 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  8)(wrflag>1);.  
13780 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
13790 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
137a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
137b0 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
137c0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
137d0 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
137e0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
137f0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
13800 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
13810 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
13820 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
13830 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
13840 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
13850 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
13860 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
13870 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
13880 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
13890 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
138a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
138b0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
138c0 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
138d0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
138e0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
138f0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
13900 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13930 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
13940 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
13950 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
13960 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
13970 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
13980 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
13990 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
139a0 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
139b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
139c0 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
139d0 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
139e0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
139f0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
13a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
13a10 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
13a20 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
13a30 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
13a60 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
13a70 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
13aa0 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
13ab0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13ae0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
13af0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
13b00 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
13b10 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
13b20 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
13b30 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
13b40 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
13b50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13b60 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
13b70 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
13b80 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
13b90 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
13ba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13bb0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
13bc0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
13bd0 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
13be0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
13bf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
13c00 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
13c10 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
13c20 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
13c30 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
13c40 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
13c50 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
13c60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13c70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74  {.      goto set
13c80 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
13c90 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
13ca0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
13cb0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
13cc0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
13cd0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
13ce0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
13cf0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
13d00 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
13d10 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
13d20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
13d30 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
13d40 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
13d50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
13d60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
13d70 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
13d80 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
13d90 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
13da0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
13db0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
13dc0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
13dd0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
13de0 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  gno);.  }..set_c
13df0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
13e00 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
13e10 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
13e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13e30 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
13e40 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20  on pPage, which 
13e50 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
13e60 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
13e70 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f  , not an overflo
13e80 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20  w.** page, is a 
13e90 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
13ea0 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68  iFrom. Modify th
13eb0 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  is pointer so th
13ec0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
13ed0 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  ** iTo. Paramete
13ee0 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
13ef0 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
13f00 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69  inter to be modi
13f10 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c  fied, as .** fol
13f20 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
13f30 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
13f40 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
13f50 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
13f60 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
13f70 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
13f80 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
13f90 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
13fa0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
13fb0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
13fc0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
13fd0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
13fe0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
14000 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
14010 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
14020 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
14030 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
14040 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
14050 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
14060 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
14070 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
140a0 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
140b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
140c0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
140d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
140e0 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
140f0 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
14100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
14120 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
14130 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14140 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
14150 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
14160 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
14170 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
14180 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
14190 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
141a0 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
141b0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
141c0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
141d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
141e0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
141f0 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
14200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14210 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
14220 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
14230 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
14240 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
14250 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
14260 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
14270 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
14280 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
14290 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
142a0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
142b0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
142c0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
142d0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
142e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
142f0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
14300 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
14310 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14320 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
14330 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
14340 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
14350 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
14360 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
14370 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
14380 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
14390 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
143a0 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
143b0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
143c0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
143d0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
143e0 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
143f0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
14400 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
14410 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14430 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
14440 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
14450 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
14460 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
14470 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
14480 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
14490 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
144a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
144b0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
144c0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
144d0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
144e0 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
144f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
14500 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
14510 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
14520 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
14530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
14540 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
14550 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
14560 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
14570 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
14580 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
14590 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
145a0 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
145b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
145c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
145d0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
145e0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
145f0 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
14600 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
14610 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14620 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
14630 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
14640 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   valid..*/.stati
14650 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
14660 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
14670 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
14680 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
14690 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
146a0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
146b0 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
146c0 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
146d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
146e0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
146f0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
14700 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
14710 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
14720 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
14730 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
14740 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
14750 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
14760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
14770 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
14780 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
14790 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a  int isCommit.){.
147a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
147b0 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
147c0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
147d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
147e0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
147f0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
14800 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
14810 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
14820 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
14830 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
14840 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
14850 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
14860 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
14870 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
14880 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
14890 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
148a0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
148b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
148c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
148d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
148e0 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
148f0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
14900 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
14910 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
14920 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
14930 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
14940 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
14950 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
14960 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
14970 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
14980 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
14990 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
149a0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
149b0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
149c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
149d0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
149e0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
149f0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
14a00 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
14a10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14a20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14a30 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
14a40 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
14a50 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
14a60 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
14a70 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
14a80 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
14a90 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
14aa0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
14ab0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
14ac0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
14ad0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
14ae0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
14af0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
14b00 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
14b10 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
14b20 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
14b30 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
14b40 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
14b50 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
14b60 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
14b70 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
14b80 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
14b90 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
14ba0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
14bb0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
14bc0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
14bd0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
14be0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
14bf0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
14c00 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
14c10 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
14c20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
14c30 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
14c40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14c50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
14c80 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
14c90 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
14ca0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
14cb0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
14cc0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
14cd0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
14ce0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
14cf0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
14d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14d40 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
14d50 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
14d60 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
14d70 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
14d80 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
14d90 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
14da0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
14db0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
14dc0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
14dd0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
14de0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
14df0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
14e00 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
14e10 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
14e20 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
14e30 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
14e40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14e80 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
14e90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
14ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
14ec0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
14ed0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
14ee0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
14ef0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
14f00 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
14f10 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
14f20 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
14f30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
14f40 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
14f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14f60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
14f70 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
14f80 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
14f90 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
14fa0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
14fb0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
14fc0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
14fd0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
14fe0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
14ff0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
15000 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
15010 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
15020 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
15030 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
15040 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
15050 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
15060 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
15070 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
15080 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
15090 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
150a0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
150b0 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
150c0 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
150d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
150e0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
150f0 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
15100 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
15110 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
15120 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
15130 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
15140 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
15150 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
15160 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
15170 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
15180 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
15190 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
151a0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
151b0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
151c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
151d0 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
151e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
151f0 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
15200 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
15210 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
15220 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
15230 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
15240 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
15250 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
15260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15270 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
15280 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
15290 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
152a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
152b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
152c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
152d0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
152e0 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e  astPg){.  Pgno n
152f0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
15300 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15310 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
15320 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
15330 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15360 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
15370 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
15380 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
15390 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
153a0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
153b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
153c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
153d0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
153e0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
153f0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
15400 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
15410 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
15420 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
15430 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
15440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15450 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
15460 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
15470 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
15480 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
15490 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
154a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
154b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
154c0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
154d0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
154e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
154f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15500 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
15510 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15520 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
15530 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20      if( nFin==0 
15540 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
15550 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
15560 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
15570 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
15580 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
15590 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20       ** if nFin 
155a0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
155b0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
155c0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
155d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
155e0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
155f0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
15600 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
15610 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
15620 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
15630 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
15640 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
15650 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
15660 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
15670 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
15680 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
15690 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
156a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
156b0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
156c0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
156d0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 1);.        i
156e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
156f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15700 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
15710 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
15720 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
15730 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
15740 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
15750 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
15760 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15770 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
15780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15790 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
157a0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
157b0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
157c0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20  age *pLastPg;.. 
157d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
157e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
157f0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
15800 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
15810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15820 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
15830 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
15840 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
15850 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
15860 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
15870 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
15880 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
15890 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
158a0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
158b0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
158c0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
158d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
158e0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
158f0 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
15900 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
15910 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
15920 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
15930 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
15940 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
15950 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
15960 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
15970 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
15980 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15990 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
159a0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
159b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
159c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
159d0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
159e0 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
159f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
15a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15a10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
15a20 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
15a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15a50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15a60 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
15a70 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
15a80 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
15a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15aa0 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
15ab0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
15ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15ad0 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e  rWrite(pLastPg->
15ae0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
15af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15b00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
15b10 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
15b20 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
15b30 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
15b40 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b  reePg, nFin!=0);
15b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15b60 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
15b70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
15b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15b90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15ba0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15bb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e  .  }..  if( nFin
15bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74  ==0 ){.    iLast
15bd0 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28  Pg--;.    while(
15be0 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
15bf0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
15c00 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ||PTRMAP_ISPAGE(
15c10 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
15c20 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41  .      if( PTRMA
15c30 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
15c40 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
15c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a    MemPage *pPg;.
15c60 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
15c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
15c80 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
15c90 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
15ca0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15cc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15cf0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
15d00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
15d10 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
15d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
15d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15d40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15d50 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15d60 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74     }.      iLast
15d70 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Pg--;.    }.    
15d80 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
15d90 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
15da0 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b  Pager, iLastPg);
15db0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15dc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15dd0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
15de0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
15df0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
15e00 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
15e10 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
15e20 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
15e30 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
15e40 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
15e50 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
15e60 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
15e70 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
15e80 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
15e90 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
15ea0 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
15eb0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
15ec0 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
15ed0 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
15ee0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
15ef0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15f00 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
15f10 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
15f20 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
15f30 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
15f40 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
15f50 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
15f60 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15f70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
15f80 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
15f90 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
15fa0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
15fb0 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
15fc0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
15fd0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
15fe0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
15ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
16000 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
16010 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
16020 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
16030 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
16040 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
16050 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
16060 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pBt));.  }.  sql
16070 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16080 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
160a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
160b0 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
160c0 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
160d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
160e0 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f  * is commited fo
160f0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
16100 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
16110 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
16120 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
16130 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
16140 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
16150 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
16160 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
16170 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
16180 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
16190 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
161a0 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
161b0 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
161c0 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
161d0 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
161e0 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
161f0 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
16200 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
16210 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
16220 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
16230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16240 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
16250 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
16260 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
16270 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
16280 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
16290 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65  ager) );..  asse
162a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
162b0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
162c0 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
162d0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
162e0 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
162f0 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
16300 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
16310 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
16320 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20    Pgno nFin;.   
16330 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20   Pgno nFree;.   
16340 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20   Pgno nPtrmap;. 
16350 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20     Pgno iFree;. 
16360 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
16370 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
16380 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e;.    Pgno nOri
16390 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  g = pagerPagecou
163a0 6e 74 28 70 42 74 29 3b 0a 0a 20 20 20 20 69 66  nt(pBt);..    if
163b0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
163c0 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
163d0 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
163e0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
163f0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
16400 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
16410 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
16420 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
16430 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
16440 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
16450 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
16460 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
16470 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
16480 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
16490 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
164a0 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
164b0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
164c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
164d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
164e0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
164f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
16500 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
16510 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61  36]);.    nPtrma
16520 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
16530 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
16540 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f  Bt, nOrig)+pgsz/
16550 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20  5)/(pgsz/5);.   
16560 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
16570 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
16580 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  .    if( nOrig>P
16590 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
165a0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
165b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
165c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
165d0 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
165e0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
165f0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
16600 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
16610 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16620 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  ){.      nFin--;
16630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
16640 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
16650 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16660 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72  T_BKPT;..    for
16670 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
16680 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
16690 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
166a0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
166b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
166c0 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29  Bt, nFin, iFree)
166d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
166e0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
166f0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
16700 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
16710 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16720 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20  TE_OK;.      rc 
16730 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16740 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
16750 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
16760 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
16770 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
16780 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
16790 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
167a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
167b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
167c0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
167d0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
167e0 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nFin);.    }.   
167f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
16810 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
16820 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
16830 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
16840 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
16850 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
16860 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
16870 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
16880 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16890 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
168a0 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
168b0 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
168c0 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
168d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
168e0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
168f0 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
16900 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
16910 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
16920 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
16930 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
16940 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
16950 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
16960 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
16970 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
16980 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
16990 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
169a0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
169b0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
169c0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
169d0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
169e0 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
169f0 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
16a00 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
16a10 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
16a20 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
16a30 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
16a40 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
16a50 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
16a60 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
16a70 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
16a80 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
16a90 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
16aa0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
16ab0 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
16ac0 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
16ad0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
16ae0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
16af0 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
16b00 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
16b10 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
16b20 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
16b30 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
16b40 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
16b50 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
16b60 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
16b70 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
16b80 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
16b90 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
16ba0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
16bb0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
16bc0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
16bd0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
16be0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
16bf0 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
16c00 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
16c10 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
16c20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
16c30 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
16c40 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
16c50 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
16c60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
16c70 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
16c80 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
16c90 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
16ca0 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
16cb0 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
16cc0 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
16cd0 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
16ce0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
16cf0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
16d00 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
16d10 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
16d20 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
16d30 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
16d40 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
16d50 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
16d60 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
16d70 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
16d80 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
16d90 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
16da0 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
16db0 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
16dc0 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
16dd0 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
16de0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
16df0 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
16e00 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
16e10 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
16e20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
16e30 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
16e40 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
16e50 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
16e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16e70 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
16e80 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
16e90 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
16ea0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
16ec0 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
16ed0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16ee0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
16ef0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
16f00 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
16f10 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
16f20 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
16f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16f40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16f50 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16f60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16f70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
16f80 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
16f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
16fa0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
16fb0 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
16fc0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
16fd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16fe0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17000 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17010 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
17020 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
17030 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
17040 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
17050 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
17060 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
17070 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
17080 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
17090 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
170a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
170b0 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
170c0 2a 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28  *pCsr;.  assert(
170d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
170e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20  dsMutex(p) );.. 
170f0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
17100 20 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70 65   cursor held ope
17110 6e 20 62 79 20 74 68 69 73 20 62 2d 74 72 65 65  n by this b-tree
17120 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20   connection. If 
17130 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a  one exists,.  **
17140 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   then the transa
17150 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ction will be do
17160 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72 65  wngraded to a re
17170 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
17180 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64  ion.  ** instead
17190 20 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e   of actually con
171a0 63 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65 71  cluded. A subseq
171b0 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d  uent call to Com
171c0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a 20  mitPhaseTwo() . 
171d0 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28   ** or Rollback(
171e0 29 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74 68  ) will finish th
171f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
17200 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  d unlock the dat
17210 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72  abase.  */.  for
17220 28 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCsr=pBt->pCurs
17230 6f 72 3b 20 70 43 73 72 20 26 26 20 70 43 73 72  or; pCsr && pCsr
17240 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43 73  ->pBtree!=p; pCs
17250 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a  r=pCsr->pNext);.
17260 20 20 61 73 73 65 72 74 28 20 70 43 73 72 3d 3d    assert( pCsr==
17270 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  0 || p->inTrans>
17280 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  TRANS_NONE );.. 
17290 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
172a0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66  ntent(pBt);.  if
172b0 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64 6f  ( pCsr ){.    do
172c0 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
172d0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
172e0 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
172f0 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
17300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17310 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
17320 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
17330 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
17340 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
17350 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17360 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
17370 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
17380 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17390 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
173a0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
173b0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
173c0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
173d0 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
173e0 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
173f0 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
17400 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
17410 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
17420 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
17430 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
17440 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
17450 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
17460 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
17470 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
17480 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
17490 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
174a0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
174b0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
174c0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
174d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
174e0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
174f0 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
17500 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
17510 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
17520 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
17530 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
17540 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
17550 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
17560 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
17570 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
17580 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
17590 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
175a0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
175b0 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
175c0 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
175d0 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
175e0 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
175f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17600 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
17610 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
17620 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
17630 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
17640 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17650 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
17660 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
17670 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
17680 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
17690 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
176a0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
176b0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
176c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
176d0 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
176e0 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
176f0 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
17700 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
17710 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
17720 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
17730 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
17740 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
17750 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
17760 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
17770 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
17780 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
17790 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
177a0 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
177b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
177c0 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
177d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
177e0 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
177f0 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
17800 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
17810 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
17820 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17830 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
17840 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
17850 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
17860 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
17870 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
17880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17890 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
178a0 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  o(Btree *p){.  B
178b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
178c0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
178d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
178e0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
178f0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
17900 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
17910 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
17920 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
17930 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
17940 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
17950 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
17960 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
17970 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
17980 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
17990 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
179a0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
179b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
179c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
179d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
179e0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
179f0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
17a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17a10 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
17a20 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
17a30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
17a50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17a60 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
17a70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17a80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
17a90 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
17aa0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
17ab0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
17ac0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17ad0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17af0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
17b00 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
17b10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17b20 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
17b30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
17b40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17b50 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
17b60 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
17b70 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
17b80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17bb0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
17bc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17bd0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17be0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
17bf0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
17c00 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17c10 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
17c20 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
17c30 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
17c40 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
17c50 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
17c60 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
17c70 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
17c80 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
17c90 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
17ca0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
17cb0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
17cc0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
17cd0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
17ce0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
17cf0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
17d00 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
17d10 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
17d20 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
17d30 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
17d40 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
17d50 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
17d60 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
17d70 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
17d80 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
17d90 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
17da0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
17db0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
17dc0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
17dd0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
17de0 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
17df0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
17e00 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
17e10 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
17e20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
17e30 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
17e40 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
17e50 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
17e60 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
17e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
17e80 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
17e90 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
17ea0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
17eb0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
17ec0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
17ed0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
17ee0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
17ef0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
17f00 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
17f10 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
17f20 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
17f30 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
17f40 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
17f50 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
17f60 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
17f70 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
17f80 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
17f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17fa0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
17fb0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
17fc0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
17fd0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
17fe0 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
17ff0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
18000 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
18010 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
18020 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
18030 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
18040 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
18050 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
18060 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
18070 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
18080 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
18090 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
180a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
180b0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
180c0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
180d0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
180e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
180f0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
18100 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
18110 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
18120 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
18130 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18140 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
18150 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
18160 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
18170 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
18180 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
18190 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
181a0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
181b0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
181c0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
181d0 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
181e0 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
181f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
18200 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
18210 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
18220 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
18230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
18240 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18250 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
18260 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
18270 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
18280 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
18290 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
182a0 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
182b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
182c0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
182d0 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
182e0 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
182f0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
18300 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
18310 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
18320 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
18330 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
18340 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
18350 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18360 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
18370 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
18380 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
18390 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
183a0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
183b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
183c0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
183d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
183e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
183f0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
18400 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
18410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18420 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
18430 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
18440 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
18450 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
18460 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
18470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
18480 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
18490 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
184a0 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
184b0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  ) error occurred
184c0 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
184d0 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
184e0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
184f0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
18500 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
18510 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
18520 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
18530 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
18540 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
18550 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
18560 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
18570 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
18580 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
18590 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
185a0 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
185b0 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
185c0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
185d0 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
185e0 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
185f0 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
18600 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
18610 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
18620 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
18630 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
18640 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
18650 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
18660 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
18670 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
18680 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
18690 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
186a0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
186b0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
186c0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
186d0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
186e0 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
186f0 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
18700 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
18710 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
18720 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
18730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
18740 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18750 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
18760 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
18770 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
18780 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
18790 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   ** call sqlite3
187a0 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  BtreeGetPage() o
187b0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
187c0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
187d0 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
187e0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
187f0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
18800 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
18810 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
18820 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
18830 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
18840 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
18850 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18860 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
18870 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
18880 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
18890 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
188a0 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
188b0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
188c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
188d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
188e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
188f0 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
18900 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
18910 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
18920 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20  tion can can be 
18930 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
18940 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
18950 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
18960 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
18970 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
18980 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
18990 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
189a0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
189b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
189c0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
189d0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
189e0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
189f0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
18a00 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
18a10 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
18a20 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
18a30 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
18a40 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
18a50 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
18a60 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
18a70 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
18a80 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
18a90 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
18aa0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
18ab0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
18ac0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
18ad0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
18ae0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
18af0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
18b00 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
18b10 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
18b20 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
18b30 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
18b40 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
18b50 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
18b60 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
18b70 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
18b80 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
18b90 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
18ba0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
18bb0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
18bc0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
18bd0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
18be0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
18bf0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
18c00 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
18c10 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
18c20 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
18c30 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
18c40 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
18c50 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
18c60 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
18c70 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
18c80 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
18c90 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
18ca0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
18cb0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
18cc0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
18cd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18ce0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
18cf0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
18d00 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
18d10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18d20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
18d30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
18d50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
18d60 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
18d70 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d   pBt->readOnly==
18d80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
18d90 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
18da0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
18db0 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
18dc0 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e  point );.  if( N
18dd0 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21  EVER(p->inTrans!
18de0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
18df0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  pBt->readOnly) )
18e00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18e10 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65  E_INTERNAL;.  }e
18e20 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
18e30 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18e40 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18e50 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   );.    /* At th
18e60 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
18e70 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
18e80 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
18e90 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a  point with.    *
18ea0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
18eb0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
18ec0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
18ed0 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
18ee0 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65      ** SQL state
18ef0 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
18f00 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
18f10 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
18f20 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  k any.    ** suc
18f30 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
18f40 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
18f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
18f60 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
18f70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
18f80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18f90 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
18fa0 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
18fb0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
18fc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18fd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18fe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
18ff0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
19000 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
19010 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
19020 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
19030 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
19040 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
19050 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
19060 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
19070 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
19080 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
19090 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
190a0 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
190b0 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
190c0 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
190d0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
190e0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
190f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
19100 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
19110 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
19120 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
19130 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
19140 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
19150 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
19160 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
19170 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
19180 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
19190 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
191a0 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
191b0 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
191c0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
191d0 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
191e0 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
191f0 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
19200 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
19210 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19220 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
19230 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
19240 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
19250 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19260 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
19270 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
19280 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
19290 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
192a0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
192b0 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
192c0 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
192d0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
192e0 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
192f0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
19300 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
19310 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
19320 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
19330 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
19340 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
19350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19360 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
19370 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
19380 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
19390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
193a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  ){.      rc = ne
193b0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
193c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
193d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
193e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
193f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19400 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
19410 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
19420 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
19430 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
19440 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
19450 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
19460 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
19470 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
19480 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
19490 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
194a0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
194b0 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
194c0 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
194d0 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
194e0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
194f0 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
19500 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
19510 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
19520 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
19530 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
19540 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
19550 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
19560 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
19570 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
19580 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
19590 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
195a0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
195b0 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
195c0 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
195d0 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
195e0 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
195f0 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
19600 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
19610 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
19620 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
19630 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
19640 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
19650 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
19660 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
19670 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
19680 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
19690 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
196a0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
196b0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
196c0 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
196d0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
196e0 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
196f0 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
19700 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
19710 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
19720 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
19730 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
19740 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
19750 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
19760 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
19770 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
19780 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
19790 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
197a0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
197b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
197c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
197d0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
197e0 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
197f0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
19800 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
19810 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
19820 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
19830 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
19840 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
19850 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
19860 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
19870 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
19880 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
19890 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
198a0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
198b0 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
198c0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
198d0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
198e0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
198f0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
19900 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79  eCursorSize() by
19910 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a  tes of memory .*
19920 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
19930 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a  pCur have been z
19940 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c  eroed by the cal
19950 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
19960 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
19970 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19990 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
199a0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
199b0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199d0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
199e0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
199f0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
19a20 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
19a30 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
19a40 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
19a50 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
19a60 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
19a70 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
19a80 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
19a90 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
19ac0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
19ad0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19b00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
19b10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19b20 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
19b30 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
19b40 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
19b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19b60 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
19b70 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
19b80 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
19b90 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
19ba0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19bb0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
19bc0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
19bd0 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
19be0 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
19bf0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
19c00 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
19c10 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
19c20 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
19c30 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
19c40 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
19c50 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
19c60 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
19c70 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
19c80 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
19c90 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
19ca0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
19cb0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
19cc0 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
19cd0 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
19ce0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
19cf0 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
19d00 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
19d10 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
19d20 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
19d30 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
19d40 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
19d50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
19d60 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
19d70 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
19d80 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
19d90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19da0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
19db0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
19dc0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19dd0 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  ta );..  if( NEV
19de0 45 52 28 77 72 46 6c 61 67 20 26 26 20 70 42 74  ER(wrFlag && pBt
19df0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
19e00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19e10 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
19e20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
19e30 26 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  & pagerPagecount
19e40 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
19e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d  return SQLITE_EM
19e60 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  PTY;.  }..  pCur
19e70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
19e80 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20  no)iTable;.  rc 
19e90 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
19ea0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
19eb0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
19ec0 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72  age[0]);.  if( r
19ed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19ef0 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 30 20 29  ->apPage[0]==0 )
19f00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
19f10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
19f20 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
19f30 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
19f40 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
19f50 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
19f60 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
19f70 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
19f80 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
19f90 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
19fa0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
19fb0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
19fc0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
19fd0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
19fe0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
19ff0 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1a000 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1a010 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1a020 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1a030 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1a040 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1a050 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1a060 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1a070 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1a080 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1a090 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1a0a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1a0b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1a0c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1a0d0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1a110 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a140 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1a150 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1a160 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a190 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1a1a0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1a1b0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1a1c0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1a1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1a1e0 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1a1f0 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1a200 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1a230 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1a240 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1a250 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a260 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1a270 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1a280 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1a290 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1a2a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1a2b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1a2c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a2d0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1a2e0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1a2f0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1a300 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1a310 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1a320 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1a330 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1a340 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1a350 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1a360 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1a370 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1a380 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1a390 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1a3a0 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1a3b0 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1a3c0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1a3d0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1a3e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1a3f0 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1a400 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1a410 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72   sizeof(BtCursor
1a420 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1a430 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1a440 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
1a450 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61  cursor in the sa
1a460 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
1a470 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20  .** as pCur and 
1a480 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20  having the same 
1a490 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
1a4a0 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76   as pCur.  The v
1a4b0 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
1a4c0 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  o iRowid..**.** 
1a4d0 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f  Only positive ro
1a4e0 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63  wid values are c
1a4f0 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20  onsidered valid 
1a500 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a  for this cache..
1a510 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20  ** The cache is 
1a520 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
1a530 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ero, indicating 
1a540 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65  an invalid cache
1a550 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c  ..** A btree wil
1a560 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68  l work fine with
1a570 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1a580 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75  e rowids.  We ju
1a590 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63  st cannot.** cac
1a5a0 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  he zero or negat
1a5b0 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63  ive rowids, whic
1a5c0 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74  h means tables t
1a5d0 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a  hat use zero or.
1a5e0 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  ** negative rowi
1a5f0 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ds might run a l
1a600 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42  ittle slower.  B
1a610 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ut in practice, 
1a620 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74  zero.** or negat
1a630 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76  ive rowids are v
1a640 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20  ery uncommon so 
1a650 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  this should not 
1a660 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
1a670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1a680 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeSetCachedRowid
1a690 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1a6a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1a6b0 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73  Rowid){.  BtCurs
1a6c0 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1a6d0 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  Cur->pBt->pCurso
1a6e0 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1a6f0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  ){.    if( p->pg
1a700 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67  noRoot==pCur->pg
1a710 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68  noRoot ) p->cach
1a720 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  edRowid = iRowid
1a730 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a740 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1a750 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a  d==iRowid );.}..
1a760 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a770 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f   cached rowid fo
1a780 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
1a790 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  or.  A negative 
1a7a0 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72  or zero.** retur
1a7b0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1a7c0 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  s that the rowid
1a7d0 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69   cache is invali
1a7e0 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a  d and should be.
1a7f0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  ** ignored.  If 
1a800 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1a810 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1a820 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20   been set, then 
1a830 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74  a.** zero is ret
1a840 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  urned..*/.sqlite
1a850 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42  3_int64 sqlite3B
1a860 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77  treeGetCachedRow
1a870 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1a880 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1a890 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a  r->cachedRowid;.
1a8a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1a8b0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
1a8c0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1a8d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1a8e0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
1a8f0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
1a900 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
1a910 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1a920 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
1a930 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
1a940 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
1a950 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
1a960 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1a970 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
1a980 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1a990 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1a9a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1a9b0 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
1a9c0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1a9d0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
1a9e0 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
1a9f0 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
1aa00 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
1aa10 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
1aa20 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
1aa30 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
1aa40 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
1aa50 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1aa60 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
1aa70 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1aa80 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
1aa90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1aaa0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1aab0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1aac0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1aad0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
1aae0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1aaf0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
1ab00 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1ab10 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
1ab20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1ab30 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1ab40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ab50 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1ab60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ab70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1ab80 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d 61  TE_TEST./*.** Ma
1ab90 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  ke a temporary c
1aba0 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67  ursor by filling
1abb0 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f   in the fields o
1abc0 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54  f pTempCur..** T
1abd0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72  he temporary cur
1abe0 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  sor is not on th
1abf0 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f  e cursor list fo
1ac00 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a  r the Btree..*/.
1ac10 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1ac20 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42  eGetTempCursor(B
1ac30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42  tCursor *pCur, B
1ac40 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75  tCursor *pTempCu
1ac50 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
1ac60 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ac70 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1ac80 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43  .  memcpy(pTempC
1ac90 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66  ur, pCur, sizeof
1aca0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 70  (BtCursor));.  p
1acb0 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  TempCur->pNext =
1acc0 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e   0;.  pTempCur->
1acd0 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72  pPrev = 0;.  for
1ace0 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75  (i=0; i<=pTempCu
1acf0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1ad00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ad10 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61 70  Ref(pTempCur->ap
1ad20 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65  Page[i]->pDbPage
1ad30 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
1ad40 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d   pTempCur->pKey=
1ad50 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  =0 );.}.#endif /
1ad60 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
1ad70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ad80 54 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  TEST./*.** Delet
1ad90 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
1ada0 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
1adb0 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
1adc0 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
1add0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
1ade0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
1adf0 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
1ae00 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
1ae10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ae20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1ae30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ae40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f  ex(pCur) );.  fo
1ae50 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1ae60 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1ae70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ae80 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ef(pCur->apPage[
1ae90 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
1aea0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1aeb0 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a  (pCur->pKey);.}.
1aec0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1aed0 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
1aee0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1aef0 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1af00 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1af10 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1af20 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1af30 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1af40 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1af50 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74  d, call.** sqlit
1af60 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1af70 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
1af80 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
1af90 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
1afa0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
1afb0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
1afc0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
1afd0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
1afe0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
1aff0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  of calls to sqli
1b000 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1b010 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1b020 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1b030 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1b040 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1b050 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1b060 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1b070 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1b080 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1b090 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1b0a0 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1b0b0 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1b0c0 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1b0d0 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1b0e0 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1b0f0 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1b100 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1b110 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1b120 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1b130 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1b140 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1b150 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1b160 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1b170 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1b180 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1b190 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1b1a0 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1b1b0 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1b1c0 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1b1d0 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1b1e0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1b1f0 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1b200 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1b210 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1b220 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1b230 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1b240 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c  (info));.    sql
1b250 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1b260 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1b270 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1b280 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1b290 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1b2a0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
1b2b0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
1b2c0 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
1b2d0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
1b2e0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
1b2f0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
1b300 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
1b310 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
1b320 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
1b330 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
1b340 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
1b350 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
1b360 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
1b370 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b380 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1b390 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
1b3a0 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
1b3b0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1b3c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b3d0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1b3e0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1b3f0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1b400 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
1b410 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
1b420 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dNKey = 1;.    }
1b430 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b440 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1b450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
1b460 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
1b470 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
1b480 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
1b490 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
1b4a0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
1b4b0 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
1b4c0 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
1b4d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    \.  if( pCur->
1b520 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b560 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61     \.    int iPa
1b570 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1b580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65      \.    sqlite
1b5c0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
1b5d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1b5e0 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1b5f0 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1b600 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
1b610 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
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 20 20 20 20 20 20 20 20 20                  
1b680 20 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 5c 0a 20 20 20 20 61 73 73         \.    ass
1b6b0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1b6c0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1b700 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1b710 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1b720 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1b730 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1b740 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1b750 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1b760 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1b770 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1b780 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1b790 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1b7a0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1b7b0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1b7c0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1b7d0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1b7e0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1b7f0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1b800 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1b810 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1b820 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1b830 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1b840 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b850 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1b860 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1b870 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1b880 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b890 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b8a0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1b8b0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1b8c0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1b8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b8e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1b8f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b900 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1b910 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b920 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
1b930 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1b940 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1b950 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
1b960 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1b970 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
1b980 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
1b990 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1b9a0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20  fo.nKey;.    }. 
1b9b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
1b9d0 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
1b9e0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1b9f0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
1ba00 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
1ba10 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1ba20 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  o.  Always retur
1ba30 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1ba40 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
1ba50 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65  ossible.  If the
1ba60 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63   cursor is not c
1ba70 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
1ba80 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
1ba90 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70   (which can happ
1baa0 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
1bab0 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   if.** the datab
1bac0 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68  ase is empty) th
1bad0 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  en *pSize is set
1bae0 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
1baf0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
1bb00 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
1bb10 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
1bb20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1bb30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1bb40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1bb50 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1bb60 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1bb70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bb80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1bb90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1bba0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1bbb0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1bbc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1bbd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1bbe0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bbf0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1bc00 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e    /* Not pointin
1bc10 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74  g at a valid ent
1bc20 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20  ry - set *pSize 
1bc30 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a  to 0. */.      *
1bc40 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
1bc50 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
1bc60 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1bc70 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
1bc80 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
1bc90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bca0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bcb0 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
1bcc0 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
1bcd0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1bce0 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
1bcf0 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
1bd00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
1bd10 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
1bd20 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
1bd30 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
1bd40 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
1bd50 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
1bd60 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
1bd70 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
1bd80 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
1bd90 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
1bda0 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
1bdb0 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
1bdc0 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
1bdd0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1bde0 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
1bdf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1be00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1be10 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
1be20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1be30 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
1be40 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
1be50 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
1be60 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
1be70 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
1be80 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
1be90 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
1bea0 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
1beb0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
1bec0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
1bed0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
1bee0 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
1bef0 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
1bf00 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
1bf10 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
1bf20 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
1bf30 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
1bf40 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
1bf50 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1bf60 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
1bf70 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1bf80 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1bf90 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
1bfa0 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
1bfb0 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
1bfc0 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
1bfd0 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
1bfe0 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
1bff0 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1c000 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
1c010 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
1c020 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
1c030 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
1c040 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
1c050 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
1c060 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
1c070 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
1c080 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1c090 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1c0a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1c0b0 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c0d0 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
1c0e0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1c0f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
1c100 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1c110 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
1c120 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
1c130 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
1c140 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
1c150 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1c160 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
1c170 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
1c180 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
1c190 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c1a0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
1c1b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c1c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c1d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1c1e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1c1f0 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1c200 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c210 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1c220 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1c230 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1c240 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1c250 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1c260 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1c270 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1c280 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1c290 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1c2a0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1c2b0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1c2c0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1c2d0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1c2e0 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1c2f0 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1c300 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1c310 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1c320 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1c330 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1c340 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1c350 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1c360 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1c370 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1c380 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1c390 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1c3a0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1c3b0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1c3c0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1c3d0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1c3e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1c3f0 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1c400 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1c410 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72  f( iGuess<=pager
1c420 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1c430 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1c440 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1c450 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1c460 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1c470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1c480 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c490 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1c4a0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1c4b0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1c4c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c4d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1c4e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1c4f0 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  f..  if( rc==SQL
1c500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c510 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1c520 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1c530 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1c540 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1c550 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
1c560 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
1c570 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
1c580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
1c590 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
1c5a0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1c5b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
1c5c0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
1c5d0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
1c5e0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
1c5f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1c600 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1c610 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1c620 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1c630 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
1c640 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
1c650 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
1c660 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
1c670 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
1c680 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
1c690 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
1c6a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1c6b0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
1c6c0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1c6d0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
1c6e0 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
1c6f0 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
1c700 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1c710 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
1c720 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
1c730 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
1c740 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
1c750 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
1c760 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c770 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
1c780 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
1c790 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
1c7a0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
1c7b0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1c7c0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
1c7d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1c7e0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1c7f0 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
1c800 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1c810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1c820 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
1c830 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
1c840 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c850 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
1c860 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c880 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
1c890 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
1c8a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c8b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1c8c0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
1c8d0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1c8f0 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
1c900 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
1c910 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
1c920 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
1c930 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
1c940 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
1c950 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
1c960 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
1c970 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
1c980 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
1c990 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
1c9a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1c9b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c9c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1c9d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c9e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1c9f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
1ca00 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
1ca10 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
1ca20 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
1ca30 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
1ca40 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
1ca50 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
1ca60 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1ca70 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
1ca80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ca90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1caa0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1cab0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
1cac0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
1cad0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
1cae0 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
1caf0 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
1cb00 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1cb10 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
1cb20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
1cb30 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
1cb40 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
1cb50 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
1cb60 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
1cb70 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
1cb80 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
1cb90 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
1cba0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1cbb0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
1cbc0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
1cbd0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1cbe0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
1cbf0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
1cc00 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
1cc10 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1cc20 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
1cc30 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
1cc40 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
1cc50 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
1cc60 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
1cc70 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72  just reads or wr
1cc80 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20  ites bytes from 
1cc90 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
1cca0 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a  .  Data might .*
1ccb0 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  * appear on the 
1ccc0 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
1ccd0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
1cce0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
1ccf0 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a  ow .** pages..**
1cd00 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
1cd10 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
1cd20 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1cd30 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
1cd40 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
1cd50 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
1cd60 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
1cd70 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
1cd80 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
1cd90 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
1cda0 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
1cdb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1cdc0 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
1cdd0 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
1cde0 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
1cdf0 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
1ce00 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
1ce10 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
1ce20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
1ce30 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
1ce40 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
1ce50 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1ce60 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1ce70 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1ce80 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
1ce90 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
1cea0 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
1ceb0 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
1cec0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
1ced0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
1cee0 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
1cef0 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
1cf00 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
1cf10 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
1cf20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
1cf30 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
1cf40 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
1cf50 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
1cf60 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
1cf70 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
1cf80 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
1cf90 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
1cfa0 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
1cfb0 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
1cfc0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
1cfd0 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
1cfe0 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
1cff0 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
1d000 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1d010 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1d020 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1d030 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1d040 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
1d050 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
1d060 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
1d070 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
1d080 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
1d090 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
1d0a0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
1d0b0 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
1d0c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1d0d0 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
1d0e0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
1d0f0 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
1d100 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20  nt skipKey,     
1d110 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65      /* offset be
1d120 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20  gins at data if 
1d130 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1d140 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
1d150 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
1d160 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
1d170 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
1d180 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1d190 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
1d1a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d1b0 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
1d1c0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
1d1d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1d1e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d1f0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
1d200 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
1d210 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
1d220 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d230 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
1d240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1d250 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
1d260 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
1d270 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
1d280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d290 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1d2a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1d2b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1d2c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1d2d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1d2e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1d2f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1d300 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
1d310 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
1d320 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
1d330 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
1d340 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b  fo.nHeader;.  nK
1d350 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74  ey = (pPage->int
1d360 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70  Key ? 0 : (int)p
1d370 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
1d380 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
1d390 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
1d3a0 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
1d3b0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
1d3c0 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
1d3d0 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79  ata .   || &aPay
1d3e0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1d3f0 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
1d400 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
1d410 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20  bleSize].  ){.  
1d420 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
1d430 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
1d440 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1d450 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
1d460 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
1d470 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d480 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
1d490 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
1d4a0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
1d4b0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
1d4c0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
1d4d0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1d4e0 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
1d4f0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
1d500 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
1d510 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
1d520 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1d530 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
1d540 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
1d550 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
1d560 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1d570 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
1d580 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1d590 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1d5a0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1d5b0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1d5c0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
1d5d0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
1d5e0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
1d5f0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
1d600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d610 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1d620 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
1d630 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
1d640 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
1d650 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
1d660 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
1d670 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
1d680 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
1d690 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
1d6a0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
1d6b0 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66  ocal]);..#ifndef
1d6c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1d6d0 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20  RBLOB.    /* If 
1d6e0 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  the isIncrblobHa
1d6f0 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1d700 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f   and the BtCurso
1d710 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20  r.aOverflow[].  
1d720 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
1d730 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
1d740 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ocate it now. Th
1d750 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  e array is sized
1d760 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65   at.    ** one e
1d770 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
1d780 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1d790 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1d7a0 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61  n. The.    ** pa
1d7b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1d7c0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
1d7d0 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
1d7e0 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a  n aOverflow[0],.
1d7f0 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61      ** etc. A va
1d800 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
1d810 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
1d820 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  y means "not yet
1d830 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28   known".    ** (
1d840 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
1d850 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
1d860 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1d870 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
1d880 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e  andle && !pCur->
1d890 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1d8a0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
1d8b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
1d8c0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
1d8d0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
1d8e0 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
1d8f0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1d900 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69  w = (Pgno *)sqli
1d910 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1d920 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c  zeof(Pgno)*nOvfl
1d930 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  );.      if( nOv
1d940 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  fl && !pCur->aOv
1d950 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1d960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1d970 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
1d980 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d990 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1d9a0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1d9b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
1d9c0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
1d9d0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
1d9e0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
1d9f0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
1da00 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
1da10 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
1da20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
1da30 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1da40 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1da50 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
1da60 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
1da70 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
1da80 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
1da90 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1daa0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
1dab0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
1dac0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
1dad0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1dae0 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
1daf0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
1db00 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
1db10 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
1db20 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1db30 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
1db40 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
1db50 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1db60 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
1db70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
1db80 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1db90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
1dba0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1dbb0 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
1dbc0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
1dbd0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1dbe0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1dbf0 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
1dc00 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
1dc10 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
1dc20 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
1dc30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1dc40 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
1dc50 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
1dc60 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
1dc70 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1dc80 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
1dc90 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1dca0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1dcb0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
1dcc0 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
1dcd0 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
1dce0 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
1dcf0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
1dd00 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
1dd10 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
1dd20 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
1dd30 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
1dd40 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
1dd50 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
1dd60 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
1dd70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1dd80 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
1dd90 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1dda0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1ddb0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
1ddc0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1ddd0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1dde0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
1ddf0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
1de00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
1de10 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
1de20 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
1de30 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
1de40 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
1de50 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
1de60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1de70 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
1de80 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
1de90 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
1dea0 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
1deb0 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
1dec0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
1ded0 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
1dee0 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
1def0 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
1df00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50    */.        DbP
1df10 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
1df20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
1df30 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
1df40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1df50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
1df60 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29  tPage, &pDbPage)
1df70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1df80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1df90 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
1dfa0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1dfb0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1dfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
1dfd0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1dfe0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
1dff0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
1e000 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
1e010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  {.            a 
1e020 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
1e030 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  set;.          }
1e040 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e050 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
1e060 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
1e070 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1e080 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e090 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e0a0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
1e0b0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
1e0c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
1e0d0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
1e0e0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1e0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e100 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e120 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
1e130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e140 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1e150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e160 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1e170 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
1e180 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1e190 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1e1a0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1e1b0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1e1c0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1e1d0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1e1e0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1e1f0 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1e200 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1e210 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1e220 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1e230 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1e240 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1e250 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1e260 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1e270 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1e280 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1e290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e2a0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
1e2b0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
1e2c0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
1e2d0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
1e2e0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1e2f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e300 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1e310 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1e320 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1e330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e340 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e350 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e360 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e370 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e380 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1e390 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e3a0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28  Page] );.    if(
1e3b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1e3c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1e3d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e3e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e3f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1e400 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e410 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
1e420 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e430 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
1e440 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
1e450 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1e460 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
1e470 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20   char*)pBuf, 0, 
1e480 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1e490 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1e4a0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
1e4b0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1e4c0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1e4d0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1e4e0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1e4f0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1e500 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1e510 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1e520 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1e530 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1e540 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1e550 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1e560 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1e570 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1e580 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e590 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1e5a0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1e5b0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1e5c0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1e5d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1e5e0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
1e5f0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1e600 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1e610 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1e620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e630 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
1e640 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
1e650 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1e660 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1e670 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
1e680 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1e690 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e6a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1e6b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1e6c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1e6d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e6e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1e6f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1e700 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1e710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1e720 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1e730 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1e740 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
1e750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1e760 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1e770 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
1e780 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1e790 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
1e7a0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
1e7b0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
1e7c0 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  pBuf, 1, 0);.  }
1e7d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e7e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1e7f0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1e800 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1e810 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1e820 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1e830 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1e840 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1e850 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1e860 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1e870 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1e880 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1e890 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1e8a0 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1e8b0 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1e8c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1e8d0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1e8e0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1e8f0 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1e900 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1e910 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1e920 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1e930 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1e940 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1e950 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1e960 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1e970 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1e980 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1e990 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1e9a0 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1e9b0 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1e9c0 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1e9d0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1e9e0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1e9f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1ea00 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1ea10 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1ea20 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1ea30 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1ea40 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1ea50 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1ea60 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1ea70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
1ea80 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
1ea90 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
1eaa0 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
1eab0 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
1eac0 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
1ead0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
1eae0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1eaf0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
1eb00 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
1eb10 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1eb20 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
1eb30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1eb40 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
1eb50 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
1eb60 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
1eb70 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
1eb80 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
1eb90 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
1eba0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
1ebb0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
1ebc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1ebd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1ebe0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
1ebf0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1ec00 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
1ec10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1ec20 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1ec30 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
1ec40 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
1ec50 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
1ec60 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
1ec70 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
1ec80 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
1ec90 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1eca0 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
1ecb0 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
1ecc0 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
1ecd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1ece0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
1ecf0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1ed00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ed10 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
1ed20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1ed30 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1ed40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ed50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ed60 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1ed70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ed80 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1ed90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1eda0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1edb0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1edc0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1edd0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1ede0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1edf0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1ee00 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1ee10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1ee20 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1ee30 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1ee40 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
1ee50 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1ee60 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
1ee70 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
1ee80 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
1ee90 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1eea0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
1eeb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1eec0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1eed0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
1eee0 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
1eef0 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
1ef00 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
1ef10 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
1ef20 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
1ef30 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
1ef40 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1ef50 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
1ef60 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
1ef70 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
1ef80 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
1ef90 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
1efa0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
1efb0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
1efc0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
1efd0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1efe0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
1eff0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
1f000 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1f010 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
1f020 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
1f030 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
1f040 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
1f050 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
1f060 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
1f070 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
1f080 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
1f090 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
1f0a0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
1f0b0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
1f0c0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
1f0d0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
1f0e0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
1f0f0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1f100 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1f110 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
1f120 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
1f130 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
1f140 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
1f150 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
1f160 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1f170 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
1f180 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1f190 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
1f1a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1f1b0 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1f1c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f1d0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1f1e0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1f1f0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1f200 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f210 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1f220 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f230 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1f240 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1f250 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1f260 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
1f270 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1f280 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1f290 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
1f2a0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1f2b0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1f2c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f2d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1f2e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1f2f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1f300 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f310 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1f320 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f330 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1f340 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1f350 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1f360 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1f370 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1f380 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1f390 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1f3a0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1f3b0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1f3c0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1f3d0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1f3e0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1f3f0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1f400 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1f410 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1f420 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1f430 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1f440 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
1f450 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
1f460 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
1f470 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f480 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
1f490 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f4a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f4b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f4c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f4d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1f4e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1f4f0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
1f500 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
1f510 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
1f520 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
1f530 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f540 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f550 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
1f560 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1f570 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
1f580 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
1f590 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f5a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
1f5b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
1f5c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
1f5d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
1f5e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
1f5f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1f600 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1f610 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
1f620 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29  wPage->nCell<1 )
1f630 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f640 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f650 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f660 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1f670 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1f680 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
1f690 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
1f6a0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
1f6b0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
1f6c0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
1f6d0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1f6e0 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
1f6f0 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
1f700 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
1f710 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
1f720 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
1f730 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
1f740 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
1f750 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
1f760 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
1f770 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
1f780 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
1f790 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
1f7a0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1f7b0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
1f7c0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
1f7d0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
1f7e0 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
1f7f0 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
1f800 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
1f810 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
1f820 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
1f830 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
1f840 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
1f850 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
1f860 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
1f870 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1f880 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
1f890 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
1f8a0 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
1f8b0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
1f8c0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
1f8d0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
1f8e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
1f8f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
1f900 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
1f910 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
1f920 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
1f930 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
1f940 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1f950 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1f960 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
1f970 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
1f980 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1f990 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
1f9a0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
1f9b0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
1f9c0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
1f9d0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
1f9e0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
1f9f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fa00 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
1fa10 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1fa20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1fa30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fa40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1fa50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1fa60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1fa70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1fa80 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
1fa90 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1faa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1fab0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
1fac0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
1fad0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1fae0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1faf0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[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 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1fb20 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
1fb30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1fb40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fb50 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
1fb60 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
1fb70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1fb80 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1fb90 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
1fba0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1fbb0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  rsor to the root
1fbc0 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
1fbd0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
1fbe0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1fbf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
1fc00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1fc10 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
1fc20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
1fc30 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1fc40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1fc50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1fc60 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1fc70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1fc80 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
1fc90 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1fca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1fcb0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
1fcc0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1fcd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1fce0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
1fcf0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1fd00 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
1fd10 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
1fd20 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
1fd30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1fd40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
1fd50 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
1fd60 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
1fd70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1fd80 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1fd90 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
1fda0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1fdb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1fdc0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
1fdd0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1fde0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1fdf0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1fe00 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [i]);.    }.  }e
1fe10 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
1fe20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
1fe30 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
1fe40 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
1fe50 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
1fe60 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20  apPage[0])).    
1fe70 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
1fe80 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1fe90 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
1fea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1feb0 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   }..  pRoot = pC
1fec0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
1fed0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1fee0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1fef0 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Root );.  pCur->
1ff00 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75  iPage = 0;.  pCu
1ff10 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
1ff20 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1ff30 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1ff40 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  >atLast = 0;.  p
1ff50 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1ff60 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74   0;..  if( pRoot
1ff70 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1ff80 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1ff90 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1ffa0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
1ffb0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
1ffc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ffd0 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
1ffe0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pRoot->pgno==1 
1fff0 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  );.    subpage =
20000 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
20010 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
20020 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
20030 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67    assert( subpag
20040 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  e>0 );.    pCur-
20050 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
20060 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
20070 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
20080 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
20090 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
200a0 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
200b0 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
200c0 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
200d0 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
200e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
200f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
20100 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
20110 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
20120 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
20130 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
20140 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
20150 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
20160 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
20170 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
20180 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
20190 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
201a0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
201b0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
201c0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
201d0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
201e0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
201f0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
20200 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
20210 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
20220 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20230 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20240 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20250 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20260 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
20270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20280 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
20290 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
202a0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
202b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
202c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
202d0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
202e0 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
202f0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
20300 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
20310 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20320 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
20330 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
20340 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
20350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20360 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
20370 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
20380 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
20390 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
203a0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
203b0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
203c0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
203d0 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
203e0 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
203f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
20400 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
20410 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
20420 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
20430 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
20440 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
20450 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
20460 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
20470 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
20480 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
20490 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
204a0 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
204b0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
204c0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
204d0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
204e0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
204f0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
20500 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
20510 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
20520 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
20530 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
20540 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20550 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
20560 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
20570 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20580 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20590 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
205a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
205b0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
205c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
205d0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
205e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
205f0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
20600 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
20610 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
20620 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
20630 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
20640 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20650 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
20660 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
20670 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
20680 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
20690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
206a0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
206b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
206c0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
206d0 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
206e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
206f0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
20700 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
20710 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
20720 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
20730 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
20740 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
20750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
20760 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
20770 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
20780 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
20790 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
207a0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
207b0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
207c0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
207d0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
207e0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
207f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
20800 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
20810 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
20820 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20830 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20840 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20850 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
20860 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
20870 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
20880 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
20890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
208a0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
208b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
208c0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
208d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
208e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
208f0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
20900 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
20910 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
20920 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
20930 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20940 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20950 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
20960 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
20970 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
20980 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
20990 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
209a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
209b0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
209c0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
209d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
209e0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
209f0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
20a00 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
20a10 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
20a20 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
20a30 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
20a40 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
20a50 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
20a60 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
20a70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20a80 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
20a90 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
20aa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
20ab0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20ac0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20ad0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20ae0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
20af0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
20b00 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
20b10 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
20b20 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
20b30 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
20b40 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
20b50 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
20b60 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
20b70 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74  tate && pCur->at
20b80 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53  Last ){.#ifdef S
20b90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
20ba0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
20bb0 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
20bc0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
20bd0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
20be0 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
20bf0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
20c00 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
20c10 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
20c20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
20c30 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
20c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
20c50 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
20c60 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
20c70 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
20c80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
20c90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20ca0 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
20cb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
20cc0 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
20cd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20ce0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20cf0 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
20d00 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
20d10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
20d20 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
20d30 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
20d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20d50 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
20d60 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
20d70 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
20d80 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
20d90 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
20da0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
20db0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
20dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
20dd0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20de0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20df0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
20e00 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
20e10 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
20e20 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
20e30 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
20e40 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20  LITE_OK ?1:0;.  
20e50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20e60 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
20e70 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
20e80 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
20e90 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
20ea0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
20eb0 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
20ec0 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
20ed0 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
20ee0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
20ef0 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
20f00 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
20f10 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
20f20 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
20f30 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
20f40 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
20f50 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
20f60 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
20f70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
20f80 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
20f90 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
20fa0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
20fb0 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
20fc0 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
20fd0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
20fe0 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
20ff0 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
21000 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
21010 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
21020 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
21030 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
21040 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
21050 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
21060 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
21070 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
21080 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
21090 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
210a0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
210b0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
210c0 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
210d0 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
210e0 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
210f0 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
21100 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
21110 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
21120 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
21130 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
21140 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
21150 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
21170 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
21180 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
21190 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
211a0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
211b0 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
211c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
211d0 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
211e0 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
211f0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
21200 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
21210 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
21220 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
21230 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
21240 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
21250 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
21260 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
21270 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
21280 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
21290 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
212a0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
212c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
212d0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
212e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
212f0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
21300 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
21310 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
21320 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
21330 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
21340 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
21350 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
21360 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
21370 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
21380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21390 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
213a0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
213b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
213c0 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
213d0 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
213e0 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
213f0 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
21400 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
21410 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
21420 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
21430 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21440 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21450 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
21460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21470 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
21480 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
21490 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
214a0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
214b0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
214c0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
214d0 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
214e0 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
214f0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
21500 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
21510 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
21520 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21530 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  && pCur->validNK
21540 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ey .   && pCur->
21550 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
21560 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
21570 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
21580 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
21590 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
215a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
215b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
215c0 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26  ( pCur->atLast &
215d0 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
215e0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
215f0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
21600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21610 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
21620 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
21630 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
21640 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
21650 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
21660 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21670 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
21680 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21690 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
216a0 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
216b0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
216c0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
216d0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
216e0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
216f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21700 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
21710 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
21720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21730 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
21740 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
21750 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
21760 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
21770 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
21780 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
21790 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
217a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
217b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
217c0 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
217d0 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
217e0 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
217f0 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
21800 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
21810 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
21820 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 28  ell-1;.    if( (
21830 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  !pPage->intKey &
21840 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c  & pIdxKey==0) ||
21850 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20   upr<0 ){.      
21860 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
21870 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
21880 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
21890 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sh;.    }.    if
218a0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
218b0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
218c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
218d0 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65  (u16)upr;.    }e
218e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
218f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21900 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72  ge] = (u16)((upr
21910 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
21920 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
21930 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
21940 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21950 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20  Page]; /* Index 
21960 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  of current cell 
21970 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20  in pPage */.    
21980 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
219b0 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
219c0 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
219d0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
219e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
219f0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
21a00 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
21a10 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
21a20 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
21a30 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
21a40 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
21a50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
21a60 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
21a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
21a80 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
21a90 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
21aa0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
21ab0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
21ac0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
21ad0 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
21ae0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
21af0 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
21b00 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
21b10 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
21b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
21b30 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
21b40 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
21b50 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
21b60 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
21b70 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
21b80 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
21b90 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
21ba0 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d   }.        pCur-
21bb0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
21bc0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
21bd0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
21be0 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
21bf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
21c00 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
21c10 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33  d page-size is 3
21c20 32 37 36 38 20 62 79 74 65 73 2e 20 54 68 69 73  2768 bytes. This
21c30 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
21c40 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
21c50 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
21c60 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
21c70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
21c80 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
21c90 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38  age is at most 8
21ca0 31 39 38 20 62 79 74 65 73 2c 20 77 68 69 63 68  198 bytes, which
21cb0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
21cc0 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
21cd0 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
21ce0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
21cf0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
21d00 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
21d10 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
21d20 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
21d30 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
21d40 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
21d50 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
21d60 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
21d70 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
21d80 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
21d90 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
21da0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
21db0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
21dc0 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
21dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
21de0 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
21df0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28  ;.        if( !(
21e00 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26  nCell & 0x80) &&
21e10 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
21e20 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
21e30 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
21e40 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
21e50 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
21e60 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
21e70 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
21e80 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
21e90 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
21ea0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
21eb0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
21ec0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
21ed0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
21ee0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
21ef0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21f00 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
21f10 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
21f20 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
21f30 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
21f40 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
21f50 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
21f60 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
21f70 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
21f80 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
21f90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21fa0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
21fb0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
21fc0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
21fd0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
21fe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
21ff0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
22000 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
22010 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
22020 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22030 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22040 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
22050 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
22060 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22070 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
22080 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
22090 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
220a0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
220b0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
220c0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
220d0 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
220e0 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
220f0 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
22100 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
22110 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
22120 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
22130 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
22140 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
22150 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
22160 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
22170 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
22180 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
22190 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
221a0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
221b0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
221c0 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
221d0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
221e0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ze;.          sq
221f0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
22200 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
22210 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
22220 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
22230 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
22240 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
22250 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
22260 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
22270 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
22280 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
22290 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
222a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
222b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
222c0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
222d0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
222e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
222f0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
22300 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
22310 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
22320 29 70 43 65 6c 6c 4b 65 79 2c 20 30 2c 20 30 29  )pCellKey, 0, 0)
22330 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
22340 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22350 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
22360 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
22370 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
22380 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
22390 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
223a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
223b0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
223c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
223d0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
223e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
223f0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
22400 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
22410 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
22420 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
22430 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
22440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22450 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22460 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
22470 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
22490 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
224a0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
224b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
224c0 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
224d0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
224e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
224f0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
22500 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
22510 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
22520 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
22540 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22550 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c  Page] = (u16)((l
22560 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
22570 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
22580 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
22590 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
225a0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
225b0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
225c0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
225d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
225e0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
225f0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
22600 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
22610 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
22620 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
22630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22640 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
22650 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
22660 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
22670 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
22680 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
22690 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
226a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
226b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
226c0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
226d0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
226e0 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
226f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
22700 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
22710 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
22720 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
22730 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
22740 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
22750 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22760 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
22770 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
22780 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
22790 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
227a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
227b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
227c0 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
227d0 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
227e0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
227f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
22800 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
22810 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
22820 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
22830 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
22840 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
22850 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
22860 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
22870 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
22880 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
22890 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
228a0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
228b0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
228c0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
228d0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
228e0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
228f0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
22900 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22910 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
22920 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
22930 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
22940 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
22950 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
22960 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
22970 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
22980 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
22990 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
229a0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
229b0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
229c0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
229d0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
229e0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
229f0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
22a00 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
22a10 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
22a20 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
22a30 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
22a40 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
22a50 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
22a60 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
22a70 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
22a80 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
22a90 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
22aa0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
22ab0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
22ac0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
22ad0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
22ae0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
22af0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
22b00 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
22b10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22b20 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
22b30 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
22b40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22b50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
22b60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22b70 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
22b80 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
22b90 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
22ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22bb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
22bc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22bd0 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res!=0 );.  if( 
22be0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
22bf0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
22c00 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
22c10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22c20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
22c30 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20  Cur->skip>0 ){. 
22c40 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
22c50 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
22c60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22c70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
22c80 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
22c90 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
22ca0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22cb0 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  e];.  idx = ++pC
22cc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22cd0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
22ce0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
22cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
22d00 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  <=pPage->nCell )
22d10 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
22d20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22d30 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
22d40 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ;.  if( idx>=pPa
22d50 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
22d60 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
22d70 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
22d80 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
22d90 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
22da0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
22db0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
22dc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
22dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
22de0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
22df0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
22e00 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
22e10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22e20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
22e30 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
22e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
22e50 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
22e60 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
22e70 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
22e80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
22ea0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
22eb0 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
22ec0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
22ed0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
22ee0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22ef0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
22f00 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22f10 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
22f20 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
22f30 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
22f40 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
22f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22f60 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
22f70 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
22f80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
22f90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22fa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22fb0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
22fc0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
22fd0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
22fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
22ff0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
23000 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
23010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
23020 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
23030 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
23040 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
23050 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
23060 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
23070 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
23080 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
23090 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
230a0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
230b0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
230c0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
230d0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
230e0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
230f0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
23100 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
23110 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
23120 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
23130 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
23140 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
23150 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
23160 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23170 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23180 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
23190 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
231a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
231b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
231c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
231d0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
231e0 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
231f0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
23200 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
23210 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
23220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23230 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
23240 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
23250 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
23260 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23280 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
23290 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
232a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
232b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
232c0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
232d0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
232e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
232f0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
23300 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23310 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
23320 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
23330 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
23340 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
23350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
23360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
23380 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
23390 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
233a0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
233b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
233c0 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
233d0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
233e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
233f0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
23400 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
23410 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23420 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
23440 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23450 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
23460 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
23470 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
23480 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
23490 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
234a0 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
234b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
234c0 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
234d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
234e0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
234f0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
23500 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
23510 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23520 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
23530 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
23540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
23570 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
23580 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
23590 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
235a0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
235b0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
235c0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
235d0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
235e0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
235f0 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
23600 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
23610 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
23620 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
23630 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
23640 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
23650 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
23660 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
23670 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
23680 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
23690 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
236a0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
236b0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
236c0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
236d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
236e0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
236f0 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
23700 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
23710 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
23720 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
23730 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
23740 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
23750 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
23760 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
23770 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
23780 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
23790 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
237a0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
237b0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
237c0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
237d0 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
237e0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
237f0 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
23800 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
23810 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
23820 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
23830 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
23840 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
23850 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
23860 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
23870 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
23880 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
23890 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
238a0 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
238b0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
238c0 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
238d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
238e0 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
238f0 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
23900 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
23910 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
23920 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
23930 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
23940 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
23950 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
23960 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
23970 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
23980 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
23990 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
239a0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
239b0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
239c0 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
239d0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
239e0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
239f0 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
23a00 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
23a10 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
23a20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
23a30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23a40 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
23a50 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
23a60 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
23a70 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
23a80 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
23a90 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
23aa0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
23ab0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
23ac0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
23ad0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
23ae0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
23af0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23b00 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
23b10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23b20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
23b30 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
23b40 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
23b50 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
23b60 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
23b70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
23b80 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
23b90 20 20 69 66 28 20 6e 3e 6d 78 50 61 67 65 20 29    if( n>mxPage )
23ba0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23bb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
23bd0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
23be0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
23bf0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
23c00 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
23c10 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
23c20 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
23c30 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23c40 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
23c50 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
23c60 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
23c70 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
23c80 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
23c90 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
23ca0 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
23cb0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
23cc0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
23cd0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
23ce0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
23cf0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
23d00 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
23d10 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
23d20 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
23d30 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
23d40 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
23d50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
23d60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
23d70 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
23d80 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
23d90 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
23da0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
23db0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
23dc0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
23dd0 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
23de0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
23df0 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
23e00 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
23e10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23e20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
23e30 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
23e40 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
23e50 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
23e60 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
23e70 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
23e80 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
23e90 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
23ea0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
23eb0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
23ec0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
23ed0 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
23ee0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
23ef0 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
23f00 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
23f10 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
23f20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23f30 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
23f40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
23f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
23f60 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
23f70 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
23f80 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
23f90 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
23fa0 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
23fb0 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
23fc0 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
23fd0 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
23fe0 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
23ff0 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
24000 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
24010 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
24020 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
24030 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
24040 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
24050 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
24060 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
24070 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
24080 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
24090 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
240a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
240b0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
240c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
240d0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
240e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
240f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
24100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24110 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
24120 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24130 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24140 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
24150 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24160 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24170 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
24180 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
24190 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
241a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
241b0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
241c0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
241d0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
241e0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
241f0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
24200 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
24210 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
24220 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
24230 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
24240 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
24250 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
24260 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
24270 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
24280 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
24290 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
242a0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
242b0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
242c0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
242d0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
242e0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
242f0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
24300 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24310 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
24320 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
24330 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
24340 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
24350 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
24360 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
24370 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
24380 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
24390 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
243a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
243b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
243c0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
243d0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
243e0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
243f0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
24400 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
24410 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
24420 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
24430 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
24440 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
24450 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
24460 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
24470 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
24480 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
24490 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
244a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
244b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
244c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
244d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
244e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
244f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
24500 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24510 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
24520 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
24530 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
24540 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
24550 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
24560 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
24570 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
24580 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
24590 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
245a0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
245b0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
245c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
245d0 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
245e0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
245f0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
24600 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
24610 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
24620 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24630 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
24640 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
24650 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
24660 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
24670 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
24680 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
24690 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
246a0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
246b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
246c0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
246d0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
246e0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
246f0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
24700 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
24710 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
24720 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
24730 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
24740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24750 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
24770 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
24780 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
24790 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
247a0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
247b0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
247c0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
247d0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
247e0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
247f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
24800 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
24810 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
24820 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
24830 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
24840 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
24850 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
24860 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
24870 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24880 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
24890 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
248a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
248b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
248c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
248d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
248e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
248f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24900 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
24910 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
24920 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
24930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24950 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24960 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
24970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24990 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
249a0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
249b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
249c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
249d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
249e0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
249f0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
24a00 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
24a10 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
24a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24a30 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
24a40 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
24a50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
24a60 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
24a70 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
24a80 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
24a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
24aa0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
24ab0 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
24ac0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
24ad0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
24ae0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
24af0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
24b00 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
24b10 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
24b20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
24b30 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
24b40 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
24b50 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
24b60 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
24b70 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24b80 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
24b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24ba0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24bb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24bc0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
24bd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24be0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24bf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24c00 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24c10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24c20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
24c30 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
24c40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
24c50 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
24c60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24c70 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
24c80 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
24c90 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
24ca0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
24cb0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
24cc0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
24cd0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
24ce0 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
24cf0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
24d00 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
24d10 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
24d20 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
24d30 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
24d40 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
24d50 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
24d60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
24d70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24d80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
24d90 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
24da0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
24db0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24dc0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24dd0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
24de0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
24df0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
24e00 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
24e10 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
24e20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
24e30 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
24e40 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
24e50 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
24e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
24e70 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
24e80 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
24e90 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
24ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
24eb0 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
24ec0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
24ed0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
24ee0 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
24ef0 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
24f00 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
24f10 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
24f20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
24f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
24f40 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
24f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24f60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
24f70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
24f80 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
24f90 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
24fa0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
24fb0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
24fc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
24fd0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
24fe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
24ff0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25000 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
25010 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25020 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
25030 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
25040 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
25050 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
25060 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
25070 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
25080 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
25090 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
250a0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
250b0 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
250c0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
250d0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
250e0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
250f0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
25100 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
25110 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
25120 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25130 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25140 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
25150 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25160 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
25170 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
25180 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
25190 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
251a0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
251b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
251c0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
251d0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
251f0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
25200 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
25210 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
25220 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
25230 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
25240 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
25250 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
25260 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
25270 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25280 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
25290 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
252a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
252b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
252c0 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
252d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
252e0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
252f0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
25300 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
25310 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
25320 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25330 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
25340 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
25350 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
25360 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25380 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25390 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
253a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
253b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
253c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
253d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
253e0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
253f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
25410 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
25420 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
25430 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25440 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
25450 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
25460 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
25470 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
25480 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
25490 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
254a0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
254b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
254c0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
254d0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
254e0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
254f0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  e */.    int nPa
25500 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
25510 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  unt(pBt);.    *p
25520 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
25530 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e  ;..    if( *pPgn
25540 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
25550 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
25560 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
25570 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
25580 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25590 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
255a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
255b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
255c0 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
255d0 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
255e0 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
255f0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
25600 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
25610 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
25620 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
25630 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
25640 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
25650 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
25660 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
25670 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
25680 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
25690 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
256a0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
256b0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
256c0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
256d0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
256e0 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
256f0 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
25700 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
25710 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
25720 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
25730 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
25740 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
25750 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
25760 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
25770 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  no, &pPg, 0);.  
25780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
257a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
257b0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
257c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
257d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
257e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
257f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25800 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  c;.      (*pPgno
25810 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  )++;.      if( *
25820 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
25830 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
25840 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20   (*pPgno)++; }. 
25850 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
25860 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
25870 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
25880 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
25890 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
258a0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
258b0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
258c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
258d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
258e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
258f0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
25900 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
25910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25920 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
25930 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
25940 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
25950 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
25960 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
25970 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
25980 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
25990 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
259a0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
259b0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
259c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
259d0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
259e0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
259f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
25a10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
25a20 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
25a30 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
25a40 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
25a50 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
25a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25a70 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
25a90 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
25aa0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
25ab0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
25ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25ad0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25ae0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25af0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
25b00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25b10 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
25b20 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
25b30 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
25b40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
25b50 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
25b60 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
25b70 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
25b80 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25b90 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
25ba0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
25bb0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
25bc0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
25bd0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
25be0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
25bf0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
25c00 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
25c10 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
25c20 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
25c30 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
25c40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
25c50 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
25c60 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
25c70 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
25c80 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
25c90 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25ca0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
25cb0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
25cc0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
25cd0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
25ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
25cf0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
25d00 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
25d10 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
25d20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
25d30 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d50 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
25d60 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
25d70 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d90 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
25da0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
25db0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
25dc0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
25dd0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
25de0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
25df0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
25e00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
25e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
25e30 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
25e40 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
25e50 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e70 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
25e80 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
25eb0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
25ec0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
25ed0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
25ee0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25ef0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
25f00 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
25f10 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
25f20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
25f30 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
25f40 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
25f50 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
25f60 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
25f70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
25f80 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
25f90 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
25fa0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
25fb0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
25fc0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
25fd0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
25fe0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
25ff0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
26000 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26010 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
26020 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
26030 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26040 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
26050 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26060 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
26070 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26080 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
26090 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
260a0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
260b0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
260c0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
260d0 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
260e0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
260f0 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
26100 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
26110 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
26120 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
26130 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  os..  */.  if( (
26140 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20  !pPage && (rc = 
26150 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
26160 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
26170 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20  &pPage, 0))).   
26180 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ||            (r
26190 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
261a0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
261b0 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Page)).  ){.    
261c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
261d0 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  t;.  }.  memset(
261e0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
261f0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
26200 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
26210 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
26220 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
26230 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
26240 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
26250 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
26260 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
26270 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
26280 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
26290 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
262a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
262b0 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
262c0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
262d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
262e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
262f0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
26300 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
26310 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
26320 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
26330 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
26340 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
26350 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
26360 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
26370 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
26380 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
26390 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
263a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
263b0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
263c0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
263d0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
263e0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
263f0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
26400 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
26410 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
26420 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
26430 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
26440 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
26450 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
26460 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
26470 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
26480 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
26490 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
264a0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
264b0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66  ){.    int nLeaf
264c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
264d0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
264e0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
264f0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
26500 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
26510 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
26520 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
26530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
26540 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26550 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
26560 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
26570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26580 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
26590 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
265a0 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
265b0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
265c0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  a[4]);.    if( n
265d0 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20  Leaf<0 ){.      
265e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
265f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
26600 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26610 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
26620 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62   nLeaf<pBt->usab
26630 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
26640 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
26650 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
26660 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
26670 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
26680 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
26690 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
266a0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
266b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
266c0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
266d0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
266e0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
266f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
26700 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
26710 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
26720 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
26730 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
26740 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
26750 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
26760 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
26770 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
26780 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
26790 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
267a0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
267b0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
267c0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
267d0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
267e0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
267f0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
26800 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
26810 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
26820 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
26830 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
26840 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
26850 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
26860 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
26870 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
26880 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63  ntain to restric
26890 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
268a0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
268b0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
268c0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
268d0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
268e0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
268f0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
26900 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
26910 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
26920 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
26930 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
26940 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
26950 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
26960 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
26970 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
26980 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
26990 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
269a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
269b0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
269c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
269d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
269e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
269f0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
26a00 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
26a10 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
26a20 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
26a30 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
26a40 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
26a50 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
26a60 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  ETE.        if( 
26a70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
26a80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
26a90 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
26aa0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
26ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26ac0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
26ad0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
26ae0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
26af0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
26b00 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
26b10 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
26b20 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
26b30 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
26b40 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
26b50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
26b60 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
26b70 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
26b80 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
26b90 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
26ba0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
26bb0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
26bc0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
26bd0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
26be0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
26bf0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
26c00 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
26c10 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
26c20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
26c30 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
26c40 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
26c50 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
26c60 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
26c70 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
26c80 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
26c90 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
26ca0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
26cb0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
26cc0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
26cd0 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65    if(   ((!pPage
26ce0 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
26cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
26d00 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
26d10 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20   &pPage, 0)))). 
26d20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63      || (0 != (rc
26d30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26d40 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26d50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  age))).  ){.    
26d60 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26d70 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
26d80 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
26d90 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
26da0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
26db0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
26dc0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
26dd0 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
26de0 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
26df0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
26e00 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
26e10 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
26e20 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
26e30 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
26e40 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
26e50 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
26e60 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
26e70 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
26e80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
26e90 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
26ea0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
26eb0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
26ec0 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
26ed0 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61  rn freePage2(pPa
26ee0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
26ef0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  pPage->pgno);.}.
26f00 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
26f10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
26f20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
26f30 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
26f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
26f50 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
26f60 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
26f70 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
26f80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
26f90 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
26fa0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
26fb0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
26fc0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
26fd0 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
26fe0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
26ff0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27000 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
27010 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
27020 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
27030 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
27040 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
27050 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
27060 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
27070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
27080 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
27090 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
270a0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
270b0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
270c0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
270d0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
270e0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
270f0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
27100 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
27110 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
27120 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
27130 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
27140 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
27150 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
27160 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
27170 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
27180 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
27190 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
271a0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
271b0 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
271c0 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
271d0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
271e0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
271f0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
27200 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
27210 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
27220 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
27230 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
27240 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
27250 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
27260 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
27270 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
27280 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
27290 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
272a0 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
272b0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
272c0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
272d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
272e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
272f0 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
27300 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
27310 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
27320 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
27330 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
27340 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27350 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27360 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
27370 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
27380 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
27390 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
273a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
273b0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
273c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
273d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
273e0 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
273f0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
27400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27410 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
27420 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
27430 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
27440 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
27450 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
27460 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
27470 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
27480 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
27490 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
274a0 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
274b0 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
274c0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
274d0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
274e0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
274f0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
27500 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
27510 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
27520 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
27530 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
27540 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
27550 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
27560 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
27570 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
27580 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
27590 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
275a0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
275b0 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
275c0 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
275d0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
275e0 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
275f0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
27600 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
27610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27620 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
27630 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
27640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27650 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
27660 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
27670 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
27680 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
27690 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
276a0 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
276b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
276c0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
276d0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
276e0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
276f0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
27700 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
27710 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27730 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
27740 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
27750 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
27760 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27780 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
27790 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
277a0 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
277b0 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
277c0 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
277d0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
277e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
277f0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
27800 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
27810 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
27820 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
27830 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
27840 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
27850 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
27860 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
27870 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
27880 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
27890 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
278a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
278b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
278c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
278d0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
278e0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
278f0 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
27900 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
27910 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
27920 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
27930 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
27940 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
27950 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
27960 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
27970 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
27980 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
27990 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
279a0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
279b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
279c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
279d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
279e0 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
279f0 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
27a00 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
27a10 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
27a20 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
27a30 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
27a40 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
27a50 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
27a60 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
27a70 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
27a80 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
27a90 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
27aa0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
27ab0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
27ac0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
27ad0 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  &nKey);.  sqlite
27ae0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
27af0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
27b00 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
27b10 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
27b20 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
27b30 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
27b40 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
27b50 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28  t( info.nData==(
27b60 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f  u32)(nData+nZero
27b70 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ) );.  .  /* Fil
27b80 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
27b90 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
27ba0 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
27bb0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
27bc0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
27bd0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
27be0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
27bf0 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
27c00 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79  e{ .    if( nKey
27c10 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
27c20 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
27c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27c40 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
27c50 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e   nPayload += (in
27c60 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  t)nKey;.    pSrc
27c70 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
27c80 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  c = (int)nKey;. 
27c90 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
27ca0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
27cb0 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
27cc0 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
27cd0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
27ce0 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
27cf0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
27d00 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
27d10 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
27d20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
27d30 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
27d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
27d50 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
27d60 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
27d70 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
27d80 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
27d90 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
27da0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
27db0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
27dc0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
27dd0 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
27de0 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
27df0 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
27e00 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
27e10 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
27e20 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
27e30 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
27e40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27e50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
27e60 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
27e70 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
27e80 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
27e90 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
27ea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27eb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
27ec0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
27ed0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
27ee0 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
27ef0 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
27f00 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
27f10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
27f20 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
27f30 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
27f40 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
27f50 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
27f60 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
27f70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
27f80 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
27f90 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
27fa0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
27fb0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
27fc0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
27fd0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
27fe0 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
27ff0 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
28000 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
28010 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
28020 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
28030 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
28040 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
28050 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
28060 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
28070 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76   uninitialised v
28080 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
28090 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
280a0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
280b0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
280c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
280d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
280e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
280f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
28100 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
28110 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
28120 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
28130 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72  LOW1);.        r
28140 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
28150 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
28160 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b  pe, pgnoPtrmap);
28170 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
28190 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
281a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
281b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
281c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
281d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
281e0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
281f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28200 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
28210 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
28220 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
28230 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
28240 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
28250 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
28260 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
28270 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
28280 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
28290 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
282a0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
282b0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
282c0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
282d0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
282e0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
282f0 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
28300 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
28310 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
28320 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
28330 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
28340 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
28350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
28360 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
28370 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
28380 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
28390 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
283a0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
283b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
283c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
283d0 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
283e0 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
283f0 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
28400 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
28410 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
28420 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
28430 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
28440 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
28450 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
28460 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
28470 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
28480 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
28490 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
284a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
284b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
284c0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
284d0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
284e0 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
284f0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
28500 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
28510 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
28520 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
28530 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
28540 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
28550 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
28560 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
28570 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
28580 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
28590 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
285a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
285b0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
285c0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
285d0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
285e0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
285f0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
28600 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
28610 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
28620 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
28630 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28640 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
28650 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
28660 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
28670 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
28680 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
28690 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
286a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
286b0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
286c0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
286d0 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
286e0 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
286f0 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
28700 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
28710 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
28720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
28730 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
28740 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
28750 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
28760 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
28770 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
28780 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
28790 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
287a0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
287b0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
287c0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
287d0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
287e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
287f0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
28800 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
28810 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28820 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
28830 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
28840 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
28850 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
28860 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
28870 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
28880 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
28890 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
288a0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
288b0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
288c0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
288d0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
288e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
288f0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
28900 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
28910 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
28920 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
28930 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
28940 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
28950 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
28960 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  int dropCell(Mem
28970 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
28980 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
28990 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
289a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
289b0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
289c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
289d0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
289e0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
289f0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
28a00 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
28a10 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
28a20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
28a30 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
28a40 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
28a50 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
28a60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
28a70 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
28a80 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
28a90 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
28aa0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28ab0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
28ac0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
28ad0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
28ae0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
28af0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
28b00 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
28b10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28b20 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
28b30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
28b40 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
28b50 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
28b60 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
28b70 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
28b80 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
28b90 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50  r);.  if( (pc<pP
28ba0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
28bb0 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
28bc0 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b  4)).     || (pc+
28bd0 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  sz>pPage->pBt->u
28be0 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20  sableSize) ){.  
28bf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28c00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28c10 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
28c20 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
28c30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
28c50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66  turn rc;.  }.  f
28c60 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
28c70 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
28c80 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
28c90 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
28ca0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
28cb0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
28cc0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
28cd0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
28ce0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
28cf0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
28d00 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
28d10 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   2;.  return SQL
28d20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28d30 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
28d40 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
28d50 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
28d60 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
28d70 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
28d80 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
28d90 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
28da0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
28db0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
28dc0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
28dd0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
28de0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
28df0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
28e00 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
28e10 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
28e20 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
28e30 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
28e40 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
28e50 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
28e60 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
28e70 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
28e80 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
28e90 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
28ea0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
28eb0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
28ec0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
28ed0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
28ee0 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
28ef0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
28f00 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
28f10 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
28f20 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
28f30 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
28f40 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
28f50 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
28f60 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
28f70 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
28f80 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
28f90 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
28fa0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
28fb0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
28fc0 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
28fd0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
28fe0 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
28ff0 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
29000 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
29010 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
29020 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
29030 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
29040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
29050 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
29060 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
29070 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
29080 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
29090 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
290a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
290b0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
290c0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
290d0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
290e0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
290f0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
29100 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
29110 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
29120 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
29130 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
29140 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
29150 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
29160 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
29170 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
29180 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 20 20  .  Pgno iChild  
29190 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
291a0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
291b0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
291c0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  this value */.){
291d0 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
291e0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
291f0 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
29200 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
29210 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
29220 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29230 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
29240 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
29250 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
29260 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
29270 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
29280 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
29290 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
292a0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
292b0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
292c0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
292d0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
292e0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
292f0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
29300 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
29310 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
29320 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
29330 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
29340 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
29350 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
29360 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
29370 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
29380 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
29390 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
293a0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
293b0 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
293c0 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
293d0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
293e0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
293f0 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
29400 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
29410 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e   data[] */..  in
29420 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c  t nSkip = (iChil
29430 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61  d ? 4 : 0);..  a
29440 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
29450 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
29460 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
29470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29480 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
29490 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
294a0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
294b0 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
294c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
294d0 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
294e0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
294f0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
29500 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
29510 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
29520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
29540 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
29550 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
29560 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
29570 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
29580 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
29590 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
295a0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
295b0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
295c0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
295d0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
295e0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
295f0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
29600 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
29610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
29620 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29630 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
29640 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
29650 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
29660 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
29670 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
29680 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
29690 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
296a0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
296b0 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  idx = (u16)i;.  
296c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
296d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
296e0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
296f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
29700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29710 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29720 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
29730 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
29740 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
29750 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29760 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
29770 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d  aData;.    hdr =
29780 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
29790 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  t;.    top = get
297a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
297b0 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  5]);.    cellOff
297c0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
297d0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
297e0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
297f0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b  2*pPage->nCell +
29800 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65   2;.    ins = ce
29810 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
29820 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f      if( end > to
29830 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20  p - sz ){.      
29840 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
29850 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
29860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29880 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29890 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  }.      top = ge
298a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
298b0 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
298c0 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
298d0 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
298e0 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
298f0 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
29900 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
29910 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
29920 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
29930 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
29940 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73  );.    if (idx+s
29950 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
29960 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20  usableSize) {.  
29970 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29980 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29990 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
299a0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
299b0 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
299c0 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 75 31 36  ge->nFree - (u16
299d0 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
299e0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
299f0 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
29a00 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
29a10 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
29a20 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
29a30 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
29a40 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
29a50 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72  for(j=end-2, ptr
29a60 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
29a70 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
29a80 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
29a90 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
29aa0 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
29ab0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
29ac0 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
29ad0 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
29ae0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
29af0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
29b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29b10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29b20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
29b30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
29b40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
29b50 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
29b60 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
29b70 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
29b80 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
29b90 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
29ba0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
29bb0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
29bc0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
29bd0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
29be0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
29bf0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
29c00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
29c10 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
29c20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
29c30 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
29c40 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
29c50 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
29c60 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
29c70 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
29c80 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
29c90 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
29ca0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
29cb0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
29cc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29cd0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
29ce0 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
29cf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
29d00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
29d10 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
29d20 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
29d30 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
29d40 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
29d50 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
29d60 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
29d70 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
29d80 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
29d90 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
29da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29db0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
29dc0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
29dd0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
29de0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
29df0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
29e00 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
29e10 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
29e20 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
29e30 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
29e40 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
29e50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29e60 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
29e70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
29e80 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
29e90 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
29ea0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
29eb0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
29ec0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
29ed0 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
29ee0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
29ef0 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
29f00 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
29f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29f20 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
29f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29f40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29f50 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
29f70 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
29f80 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
29f90 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
29fa0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
29fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29fc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
29fd0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
29fe0 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
29ff0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2a000 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2a010 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2a020 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2a030 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2a040 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a050 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2a060 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2a070 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2a080 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2a090 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
2a0a0 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2a0b0 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2a0c0 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2a0d0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c  ; i--){.    pCel
2a0e0 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
2a0f0 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65  ellbody -= aSize
2a100 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
2a110 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2a120 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2a130 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2a140 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
2a150 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ize[i]);.  }.  p
2a160 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2a170 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2a180 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2a190 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2a1a0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2a1b0 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2a1c0 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2a1d0 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2a1e0 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2a1f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2a200 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2a210 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2a220 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2a230 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2a240 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2a250 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2a260 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2a270 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2a280 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2a290 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2a2a0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2a2b0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2a2c0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2a2d0 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2a2e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2a2f0 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2a300 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2a310 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2a320 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2a330 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2a340 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2a350 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2a360 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2a370 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2a380 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2a390 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2a3a0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2a3b0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2a3c0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2a3d0 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2a3e0 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2a3f0 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2a400 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2a410 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2a420 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2a430 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2a440 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2a450 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2a460 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2a470 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2a480 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2a490 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2a4a0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2a4b0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2a4c0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2a4d0 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2a4e0 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2a4f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2a500 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2a510 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2a520 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2a530 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2a540 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2a550 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2a560 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2a570 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2a580 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2a590 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2a5a0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2a5b0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2a5c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2a5d0 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2a5e0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2a5f0 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2a600 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
2a610 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2a620 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
2a630 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
2a640 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
2a650 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
2a660 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
2a670 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
2a680 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
2a690 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
2a6a0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
2a6b0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
2a6c0 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
2a6d0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
2a6e0 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
2a6f0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
2a700 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
2a710 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
2a720 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
2a730 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
2a740 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
2a750 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
2a760 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
2a770 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
2a780 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
2a790 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
2a7a0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
2a7b0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
2a7c0 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
2a7d0 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
2a7e0 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
2a7f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2a800 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
2a810 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
2a820 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
2a830 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
2a840 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
2a850 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
2a860 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
2a870 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
2a880 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
2a890 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
2a8a0 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
2a8b0 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
2a8c0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2a8d0 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
2a8e0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
2a8f0 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
2a900 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
2a910 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
2a920 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
2a930 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
2a940 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2a950 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
2a960 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
2a970 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
2a980 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
2a990 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
2a9a0 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
2a9b0 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
2a9c0 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
2a9d0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9f0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
2aa00 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2aa10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa30 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2aa40 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2aa70 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
2aa80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2aa90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2aaa0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2aab0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2aac0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2aad0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2aae0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2aaf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2ab00 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
2ab10 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
2ab20 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l<=0 ) return SQ
2ab30 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2ab40 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
2ab50 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
2ab60 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2ab70 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
2ab80 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
2ab90 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
2aba0 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
2abb0 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
2abc0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2abd0 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
2abe0 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
2abf0 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
2ac00 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
2ac10 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
2ac20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2ac30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2ac40 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
2ac50 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
2ac60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
2ac70 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
2ac80 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
2ac90 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
2aca0 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
2acb0 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
2acc0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2acd0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2ace0 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
2acf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2ad00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ad10 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
2ad20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ad30 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
2ad40 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2ad50 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2ad60 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
2ad70 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
2ad80 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2ad90 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
2ada0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
2adb0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
2adc0 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
2add0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2ade0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2adf0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
2ae00 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
2ae10 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
2ae20 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
2ae30 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
2ae40 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
2ae50 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
2ae60 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
2ae70 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
2ae80 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
2ae90 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
2aea0 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
2aeb0 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
2aec0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
2aed0 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
2aee0 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
2aef0 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
2af00 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
2af10 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
2af20 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
2af30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2af40 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2af50 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
2af60 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
2af70 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
2af80 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
2af90 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
2afa0 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
2afb0 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
2afc0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
2afd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2afe0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2aff0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2b000 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
2b010 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2b020 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2b030 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
2b040 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26  pNew->minLocal &
2b050 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b060 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b070 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2b080 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a 20  (pNew, pCell);. 
2b090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2b0a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2b0b0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
2b0c0 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
2b0d0 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
2b0e0 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
2b0f0 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
2b100 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
2b110 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2b120 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
2b130 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
2b140 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
2b150 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
2b160 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
2b170 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
2b180 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
2b190 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2b1a0 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
2b1b0 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
2b1c0 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
2b1d0 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
2b1e0 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
2b1f0 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
2b200 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
2b210 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
2b220 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
2b230 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
2b240 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2b250 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
2b260 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
2b270 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
2b280 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
2b290 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2b2a0 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
2b2b0 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
2b2c0 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
2b2d0 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
2b2e0 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
2b2f0 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
2b300 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
2b310 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
2b320 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
2b330 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
2b340 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
2b350 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
2b360 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
2b370 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
2b380 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2b390 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
2b3a0 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
2b3b0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2b3c0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
2b3d0 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
2b3e0 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2b3f0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2b400 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2b410 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
2b420 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
2b430 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2b440 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
2b450 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
2b460 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
2b470 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
2b480 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2b490 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  t,pParent->nCell
2b4a0 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70 4f  ,pSpace,(int)(pO
2b4b0 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50 61  ut-pSpace),0,pPa
2b4c0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  ge->pgno);..    
2b4d0 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
2b4e0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
2b4f0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
2b500 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
2b510 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
2b520 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2b530 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2b540 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2b550 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
2b560 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2b570 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
2b580 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
2b590 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
2b5a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b5b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b5c0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2b5d0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
2b5e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b5f0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
2b600 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
2b610 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
2b620 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
2b630 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
2b640 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
2b650 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
2b660 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
2b670 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
2b680 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
2b690 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
2b6a0 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2b6b0 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
2b6c0 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
2b6d0 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
2b6e0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
2b6f0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
2b700 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
2b710 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
2b720 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
2b730 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
2b740 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2b750 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
2b760 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2b770 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
2b780 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
2b790 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
2b7a0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2b7b0 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
2b7c0 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
2b7d0 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
2b7e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
2b7f0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2b800 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  e, z, &info);.  
2b810 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
2b820 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
2b830 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
2b840 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69  t4byte(&z[info.i
2b850 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
2b860 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2b870 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29  t, ovfl, &e, &n)
2b880 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b890 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2b8a0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56   && e==PTRMAP_OV
2b8b0 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20  ERFLOW1 );.     
2b8c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
2b8d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b8e0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2b8f0 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20  = get4byte(z);. 
2b900 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2b910 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2b920 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2b930 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2b940 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2b950 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  P_BTREE );.     
2b960 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2b970 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2b980 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
2b990 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2b9a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2b9b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2b9c0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74  .      ptrmapGet
2b9d0 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2b9e0 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65   &n);.      asse
2b9f0 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2ba00 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2ba10 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20  BTREE );.    }. 
2ba20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2ba30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2ba40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ba50 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65  used to copy the
2ba60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ba70 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f   b-tree node sto
2ba80 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20  red .** on page 
2ba90 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2baa0 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d  o. If page pFrom
2bab0 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20   was not a leaf 
2bac0 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  page, then.** th
2bad0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2bae0 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63  tries for each c
2baf0 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70  hild page are up
2bb00 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2bb10 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65  e.** parent page
2bb20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2bb30 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61  ointer map is pa
2bb40 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d  ge pTo. If pFrom
2bb50 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e   contained.** an
2bb60 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65  y cells with ove
2bb70 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2bb80 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
2bb90 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e  rresponding poin
2bba0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
2bbb0 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61  es are also upda
2bbc0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
2bbd0 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70  parent page is p
2bbe0 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49  age pTo..**.** I
2bbf0 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65  f pFrom is curre
2bc00 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e  ntly carrying an
2bc10 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  y overflow cells
2bc20 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65   (entries in the
2bc30 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66  .** MemPage.aOvf
2bc40 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
2bc50 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
2bc60 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
2bc70 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
2bc80 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
2bc90 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
2bca0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2bcb0 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
2bcc0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
2bcd0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2bce0 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
2bcf0 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
2bd00 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
2bd10 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
2bd20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
2bd30 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
2bd40 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
2bd50 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
2bd60 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
2bd70 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
2bd80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bd90 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
2bda0 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
2bdb0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20  MemPage *pTo){. 
2bdc0 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
2bdd0 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
2bde0 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  Bt;.  u8 * const
2bdf0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
2be00 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
2be10 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61  nst aTo = pTo->a
2be20 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73  Data;.  int cons
2be30 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
2be40 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
2be50 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
2be60 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
2be70 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
2be80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2be90 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74  E_OK;.  int iDat
2bea0 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  a;..  assert( pF
2beb0 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
2bec0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2bed0 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2bee0 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
2bef0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2bf00 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73  Hdr+5])<=pBt->us
2bf10 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f  ableSize );..  /
2bf20 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65  * Copy the b-tre
2bf30 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66  e node content f
2bf40 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74  rom page pFrom t
2bf50 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20  o page pTo. */. 
2bf60 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
2bf70 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
2bf80 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
2bf90 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46  &aTo[iData], &aF
2bfa0 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d  rom[iData], pBt-
2bfb0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74  >usableSize-iDat
2bfc0 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54  a);.  memcpy(&aT
2bfd0 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
2bfe0 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
2bff0 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
2c000 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
2c010 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  ;..  /* Reinitia
2c020 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2c030 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2c040 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2c050 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
2c060 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
2c070 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
2c080 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22  ization of pTo "
2c090 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73  cannot" fail, as
2c0a0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20 63   the.  ** data c
2c0b0 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d  opied from pFrom
2c0c0 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
2c0d0 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f  valid.  */.  pTo
2c0e0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2c0f0 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20  TESTONLY(rc = ) 
2c100 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2c110 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73  Page(pTo);.  ass
2c120 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2c130 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OK );..  /* If t
2c140 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2c150 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2c160 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2c170 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
2c180 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
2c190 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
2c1a0 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
2c1b0 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
2c1c0 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20  ointers to. */. 
2c1d0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2c1e0 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  M ){.    rc = se
2c1f0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
2c200 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2c210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2c220 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
2c230 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f  tributes cells o
2c240 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78  n the iParentIdx
2c250 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61  'th child of pPa
2c260 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74  rent.** (hereaft
2c270 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61  er "the page") a
2c280 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69  nd up to 2 sibli
2c290 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  ngs so that all 
2c2a0 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
2c2b0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f   the.** same amo
2c2c0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
2c2d0 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e  e. Usually a sin
2c2e0 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65  gle sibling on e
2c2f0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
2c300 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73  e.** page are us
2c310 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
2c320 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68  ing, though both
2c330 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
2c340 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a  come from one.**
2c350 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67   side if the pag
2c360 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  e is the first o
2c370 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
2c380 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74  its parent. If t
2c390 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20  he page .** has 
2c3a0 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62  fewer than 2 sib
2c3b0 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67  lings (something
2c3c0 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
2c3d0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61  happen if the pa
2c3e0 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20  ge.** is a root 
2c3f0 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20  page or a child 
2c400 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20  of a root page) 
2c410 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
2c420 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70  le siblings.** p
2c430 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2c440 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
2c450 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2c460 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65   siblings of the
2c470 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69   page might be i
2c480 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
2c490 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65  eased by .** one
2c4a0 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66   or two in an ef
2c4b0 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
2c4c0 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
2c4d0 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
2c4e0 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  . .**.** Note th
2c4f0 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
2c500 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
2c510 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  some of the cell
2c520 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
2c530 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
2c540 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
2c550 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2c560 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
2c570 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
2c580 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68   is overfull. Th
2c590 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2c5a0 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c  es that all cell
2c5b0 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74  s allocated.** t
2c5c0 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  o the page and i
2c5d0 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20  ts siblings fit 
2c5e0 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61  into MemPage.aDa
2c5f0 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75  ta[] before retu
2c600 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rning..**.** In 
2c610 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
2c620 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65  lancing the page
2c630 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2c640 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a  s, cells may be.
2c650 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
2c660 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
2c670 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c680 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e   (pParent). Doin
2c690 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73  g so.** may caus
2c6a0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2c6b0 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  e to become over
2c6c0 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
2c6d0 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61  l. If this.** ha
2c6e0 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65  ppens, it is the
2c6f0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2c700 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
2c710 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72   invoke the corr
2c720 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  ect.** balancing
2c730 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20   routine to fix 
2c740 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65  this problem (se
2c750 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  e the balance() 
2c760 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a  routine). .**.**
2c770 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
2c780 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
2c790 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
2c7a0 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
2c7b0 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
2c7c0 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69  pted state. So i
2c7d0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
2c7e0 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
2c7f0 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
2c800 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
2c810 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67  ** The third arg
2c820 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2c830 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61  nction, aOvflSpa
2c840 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ce, is a pointer
2c850 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20   to a.** buffer 
2c860 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
2c870 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20  in size. If, in 
2c880 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
2c890 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
2c8a0 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
2c8b0 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ), the parent pa
2c8c0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
2c8d0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
2c8e0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
2c8f0 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 73  tore the parents
2c900 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
2c910 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
2c920 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
2c930 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
2c940 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
2c950 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2c960 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
2c970 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
2c980 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
2c990 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
2c9a0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
2c9b0 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
2c9c0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
2c9d0 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
2c9e0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
2c9f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2ca00 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
2ca10 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
2ca20 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
2ca30 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
2ca40 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
2ca50 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
2ca60 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
2ca70 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
2ca80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2ca90 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
2caa0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2cab0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2cac0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
2cad0 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
2cae0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
2caf0 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
2cb20 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
2cb30 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
2cb40 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
2cb50 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
2cb60 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
2cb70 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
2cb80 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
2cb90 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
2cba0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2cbb0 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
2cbc0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a  root-page */.){.
2cbd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cbf0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
2cc00 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
2cc10 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2cc20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cc30 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
2cc40 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
2cc50 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
2cc60 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
2cc70 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
2cc80 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
2cc90 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
2cca0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
2ccb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ccc0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
2ccd0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
2cce0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2ccf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cd00 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
2cd10 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
2cd20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
2cd30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2cd40 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2cd50 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
2cd60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2cd70 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
2cd80 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
2cd90 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
2cda0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2cdb0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2cdc0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
2cdd0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
2cde0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
2cdf0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2ce00 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
2ce10 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ce30 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
2ce40 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
2ce50 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
2ce60 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
2ce70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ce80 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
2ce90 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
2cea0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
2ceb0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2cec0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2ced0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2cee0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
2cef0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2cf00 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
2cf10 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
2cf20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
2cf30 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
2cf40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2cf50 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2cf60 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
2cf70 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
2cf80 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
2cf90 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2cfa0 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
2cfb0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
2cfc0 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
2cfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2cfe0 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
2cff0 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
2d000 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
2d010 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
2d020 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2d030 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
2d040 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
2d050 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
2d060 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
2d070 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
2d080 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
2d090 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
2d0a0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
2d0b0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
2d0c0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
2d0d0 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
2d0e0 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
2d0f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
2d100 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
2d110 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
2d120 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
2d130 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
2d140 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
2d150 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
2d160 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
2d170 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2d180 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2d190 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
2d1a0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
2d1b0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
2d1c0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2d1d0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
2d1e0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
2d1f0 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
2d200 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2d210 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2d220 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2d230 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
2d240 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d260 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2d270 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
2d280 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
2d290 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
2d2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
2d2b0 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
2d2c0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
2d2d0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2f0 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
2d300 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
2d310 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
2d320 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
2d330 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d360 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2d370 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2d380 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2d390 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
2d3a0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
2d3b0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
2d3c0 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
2d3d0 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
2d3e0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
2d3f0 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
2d400 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
2d410 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
2d420 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
2d430 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
2d440 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
2d450 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
2d460 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
2d470 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
2d480 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
2d490 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
2d4a0 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
2d4b0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
2d4c0 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
2d4d0 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
2d4e0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
2d4f0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2d500 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2d510 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2d520 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2d530 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2d540 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2d550 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76   || pParent->aOv
2d560 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65  fl[0].idx==iPare
2d570 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
2d580 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
2d590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d5a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
2d5b0 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
2d5c0 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
2d5d0 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
2d5e0 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
2d5f0 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
2d600 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
2d610 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
2d620 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
2d630 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
2d640 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
2d650 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
2d660 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
2d670 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
2d680 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
2d690 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
2d6a0 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
2d6b0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
2d6c0 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
2d6d0 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
2d6e0 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
2d6f0 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
2d700 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
2d710 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
2d720 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
2d730 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
2d740 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
2d750 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2d760 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
2d770 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
2d780 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
2d790 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
2d7a0 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
2d7b0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
2d7c0 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
2d7d0 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65   page, as if one
2d7e0 20 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20   existed it has 
2d7f0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
2d800 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20  n removed.  */. 
2d810 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
2d820 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
2d830 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
2d840 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
2d850 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
2d860 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
2d870 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
2d880 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2d890 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
2d8a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
2d8b0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
2d8c0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
2d8d0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
2d8e0 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
2d8f0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
2d900 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
2d910 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
2d920 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
2d930 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2d940 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
2d950 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2d960 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
2d970 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2d980 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
2d990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
2d9a0 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
2d9b0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2d9c0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2d9d0 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
2d9e0 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
2d9f0 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
2da00 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
2da10 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2da20 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
2da30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2da40 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
2da50 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d  d, 0, i*sizeof(M
2da60 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
2da70 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2da80 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
2da90 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
2daa0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
2dab0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
2dac0 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
2dad0 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
2dae0 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d      if( pParent-
2daf0 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b  >nOverflow && i+
2db00 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
2db10 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a  aOvfl[0].idx ){.
2db20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2db30 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2db40 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  0].pCell;.      
2db50 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2db60 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2db70 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
2db80 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
2db90 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
2dba0 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
2dbb0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
2dbc0 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
2dbd0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2dbe0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2dbf0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2dc00 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
2dc10 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
2dc20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
2dc30 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
2dc40 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
2dc50 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
2dc60 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
2dc70 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2dc80 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
2dc90 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
2dca0 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
2dcb0 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
2dcc0 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
2dcd0 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
2dce0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
2dcf0 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
2dd00 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
2dd10 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
2dd20 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
2dd30 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
2dd40 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
2dd50 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2dd60 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
2dd70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
2dd80 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
2dd90 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
2dda0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
2ddb0 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
2ddc0 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
2ddd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
2dde0 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20  nless SQLite is 
2ddf0 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75  compiled in secu
2de00 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
2de10 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20  In this case,.  
2de20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43      ** the dropC
2de30 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ell() routine wi
2de40 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2de50 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74   entire cell wit
2de60 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20  h zeroes..      
2de70 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
2de80 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70   temporarily cop
2de90 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20  y the cell into 
2dea0 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
2deb0 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72  .      ** buffer
2dec0 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70  . It will be cop
2ded0 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73  ied out again as
2dee0 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70   soon as the aSp
2def0 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20  ace[] buffer.   
2df00 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74     ** is allocat
2df10 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  ed.  */.#ifdef S
2df20 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
2df30 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ETE.      memcpy
2df40 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44  (&aOvflSpace[apD
2df50 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
2df60 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c  Data], apDiv[i],
2df70 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20   szNew[i]);.    
2df80 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
2df90 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
2dfa0 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
2dfb0 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ];.#endif.      
2dfc0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2dfd0 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
2dfe0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
2dff0 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[i]);.    }. 
2e000 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
2e010 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
2e020 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
2e030 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
2e040 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
2e050 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
2e060 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
2e070 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
2e080 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
2e090 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
2e0a0 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
2e0b0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
2e0c0 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
2e0d0 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
2e0e0 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
2e0f0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2e100 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e120 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
2e130 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2e140 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e160 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
2e170 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e1a0 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
2e1b0 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e1e0 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
2e1f0 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
2e200 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
2e210 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
2e220 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
2e230 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
2e240 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2e250 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2e260 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2e270 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2e280 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
2e290 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
2e2a0 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
2e2b0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
2e2c0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2e2d0 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
2e2e0 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
2e2f0 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
2e300 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
2e310 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
2e320 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2e330 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
2e340 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
2e350 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
2e360 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
2e370 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2e380 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
2e390 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
2e3a0 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
2e3b0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
2e3c0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
2e3d0 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
2e3e0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2e3f0 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
2e400 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
2e410 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
2e420 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
2e430 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
2e440 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
2e450 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
2e460 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
2e470 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
2e480 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
2e490 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
2e4a0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
2e4b0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2e4c0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
2e4d0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
2e4e0 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
2e4f0 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
2e500 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
2e510 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
2e520 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2e530 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
2e540 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
2e550 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
2e560 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
2e570 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
2e580 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
2e590 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
2e5a0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
2e5b0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
2e5c0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
2e5d0 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
2e5e0 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
2e5f0 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
2e600 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
2e610 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
2e620 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
2e630 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2e640 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
2e650 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
2e660 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
2e670 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
2e680 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
2e690 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
2e6a0 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
2e6b0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
2e6c0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
2e6d0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
2e6e0 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
2e6f0 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
2e700 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
2e710 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2e720 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
2e730 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
2e740 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
2e750 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
2e760 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
2e770 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
2e780 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
2e790 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
2e7a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
2e7b0 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
2e7c0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
2e7d0 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
2e7e0 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
2e7f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
2e800 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
2e810 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
2e820 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
2e830 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
2e840 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
2e850 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
2e860 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
2e870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2e880 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2e890 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
2e8a0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
2e8b0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
2e8c0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2e8d0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
2e8e0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
2e8f0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
2e900 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2e910 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
2e920 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
2e930 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
2e940 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
2e950 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
2e960 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2e970 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
2e980 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2e990 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
2e9a0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
2e9b0 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
2e9c0 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
2e9d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
2e9e0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
2e9f0 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
2ea00 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
2ea10 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2ea20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
2ea30 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
2ea40 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
2ea50 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
2ea60 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
2ea70 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2ea80 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
2ea90 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2eaa0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
2eab0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c  [nCell] = szCell
2eac0 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f  [nCell] - leafCo
2ead0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2eae0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2eaf0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2eb00 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2eb10 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2eb20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
2eb30 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
2eb40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
2eb50 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
2eb60 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
2eb70 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
2eb80 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
2eb90 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2eba0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2ebb0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
2ebc0 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
2ebd0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
2ebe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ebf0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2ec00 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2ec10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2ec20 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
2ec30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
2ec40 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
2ec50 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
2ec60 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
2ec70 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2ec80 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
2ec90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2eca0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2ecb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2ecc0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2ecd0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2ece0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
2ecf0 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
2ed00 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
2ed10 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
2ed20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
2ed30 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2ed40 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
2ed50 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
2ed60 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
2ed70 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
2ed80 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
2ed90 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
2eda0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
2edb0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
2edc0 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
2edd0 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
2ede0 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
2edf0 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
2ee00 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
2ee10 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
2ee20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2ee30 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
2ee40 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2ee50 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
2ee60 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
2ee70 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
2ee80 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2ee90 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
2eea0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
2eeb0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
2eec0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
2eed0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
2eee0 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
2eef0 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
2ef00 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2ef10 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
2ef20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2ef30 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2ef40 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
2ef50 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
2ef60 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
2ef70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
2ef80 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
2ef90 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
2efa0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
2efb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
2efc0 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
2efd0 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
2efe0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
2eff0 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
2f000 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
2f010 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
2f020 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
2f030 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
2f040 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
2f050 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
2f060 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
2f070 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
2f080 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
2f090 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
2f0a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f0b0 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  RUPT; goto balan
2f0c0 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
2f0d0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
2f0e0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
2f0f0 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
2f100 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
2f110 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
2f120 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
2f130 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
2f140 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
2f150 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
2f160 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
2f170 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
2f180 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
2f190 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
2f1a0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
2f1b0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2f1c0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
2f1d0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2f1e0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
2f1f0 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
2f200 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
2f210 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
2f220 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
2f230 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
2f240 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2f250 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
2f260 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2f270 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
2f280 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
2f290 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
2f2a0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
2f2b0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
2f2c0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
2f2d0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
2f2e0 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
2f2f0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
2f300 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
2f310 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
2f320 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
2f330 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2f340 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
2f350 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
2f360 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
2f370 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
2f380 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
2f390 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
2f3a0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
2f3b0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
2f3c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f3d0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
2f3e0 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
2f3f0 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
2f400 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
2f410 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2f420 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
2f430 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
2f440 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
2f450 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2f460 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
2f470 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2f480 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
2f490 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2f4a0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
2f4b0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
2f4c0 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
2f4d0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
2f4e0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
2f4f0 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
2f500 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
2f510 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
2f520 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
2f530 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
2f540 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
2f550 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
2f560 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2f570 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2f580 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
2f590 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
2f5a0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
2f5b0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
2f5c0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
2f5d0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
2f5e0 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
2f5f0 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
2f600 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
2f610 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2f620 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
2f630 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
2f640 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
2f650 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
2f660 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
2f670 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
2f680 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2f690 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
2f6a0 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
2f6b0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
2f6c0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
2f6d0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2f6e0 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
2f6f0 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b  d  ",.    apOld[
2f700 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e  0]->pgno, .    n
2f710 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31  Old>=2 ? apOld[1
2f720 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20  ]->pgno : 0,.   
2f730 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64   nOld>=3 ? apOld
2f740 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20  [2]->pgno : 0.  
2f750 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ));..  /*.  ** A
2f760 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
2f770 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
2f780 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
2f790 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ible..  */.  if(
2f7a0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c   apOld[0]->pgno<
2f7b0 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =1 ){.    rc = S
2f7c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2f7d0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2f7e0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
2f7f0 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
2f800 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
2f810 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2f820 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2f830 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
2f840 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
2f850 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
2f860 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
2f870 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2f880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f890 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2f8a0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
2f8b0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
2f8c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2f8d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2f8e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f8f0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
2f900 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2f910 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2f920 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
2f930 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
2f940 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2f950 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2f960 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2f970 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
2f980 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
2f990 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
2f9a0 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
2f9b0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2f9c0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
2f9d0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2f9e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2f9f0 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
2fa00 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2fa10 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2fa20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
2fa30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fa40 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2fa50 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fa60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fa70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2fa80 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
2fa90 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
2faa0 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
2fab0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
2fac0 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
2fad0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2fae0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2faf0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2fb00 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fb10 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2fb20 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
2fb30 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2fb40 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
2fb50 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
2fb60 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
2fb70 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
2fb80 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
2fb90 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
2fba0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
2fbb0 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
2fbc0 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
2fbd0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
2fbe0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2fbf0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
2fc00 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
2fc10 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
2fc20 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
2fc30 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
2fc40 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
2fc50 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
2fc60 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
2fc70 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
2fc80 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
2fc90 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
2fca0 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
2fcb0 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
2fcc0 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
2fcd0 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
2fce0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
2fcf0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
2fd00 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
2fd10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
2fd20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
2fd30 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
2fd40 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
2fd50 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
2fd60 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
2fd70 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
2fd80 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
2fd90 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
2fda0 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
2fdb0 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
2fdc0 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
2fdd0 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
2fde0 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
2fdf0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
2fe00 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
2fe10 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
2fe20 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
2fe30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2fe40 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
2fe50 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
2fe60 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
2fe70 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d     t = apNew[i]-
2fe80 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20  >pgno;.      pT 
2fe90 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
2fea0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
2feb0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
2fec0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
2fed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
2fee0 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
2fef0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
2ff00 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
2ff10 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
2ff20 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
2ff30 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
2ff40 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
2ff50 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
2ff60 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
2ff70 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
2ff80 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
2ff90 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
2ffa0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
2ffb0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
2ffc0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
2ffd0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
2ffe0 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
2fff0 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
30000 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
30010 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
30020 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30030 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30040 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30050 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
30060 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
30070 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
30080 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
30090 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
300a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
300b0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
300c0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
300d0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
300e0 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
300f0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
30100 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
30110 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
30120 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
30130 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
30140 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
30150 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
30160 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
30170 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
30180 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
30190 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
301a0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
301b0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
301c0 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
301d0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
301e0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
301f0 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
30200 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
30210 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
30220 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
30230 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
30240 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
30250 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
30260 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
30270 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
30280 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
30290 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
302a0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
302b0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
302c0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
302d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
302e0 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
302f0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
30300 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
30310 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
30320 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
30330 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
30340 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
30350 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
30360 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
30370 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
30380 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
30390 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
303a0 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
303b0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
303c0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
303d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
303e0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
303f0 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
30400 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
30410 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
30420 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
30430 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
30440 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
30450 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
30460 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
30470 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
30480 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
30490 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
304a0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
304b0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
304c0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
304d0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
304e0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
304f0 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
30500 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
30510 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
30520 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
30530 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30540 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
30550 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
30560 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
30570 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
30580 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
30590 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
305a0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
305b0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
305c0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
305d0 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
305e0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
305f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
30600 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
30610 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
30620 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
30630 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
30640 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
30650 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
30660 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
30670 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
30680 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
30690 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
306a0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
306b0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
306c0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
306d0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
306e0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
306f0 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
30700 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
30710 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
30720 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
30730 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
30740 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
30750 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
30760 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
30770 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
30780 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
30790 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
307a0 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
307b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
307c0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
307d0 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
307e0 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
307f0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
30800 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
30810 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
30820 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
30830 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
30840 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
30850 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
30860 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
30870 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
30880 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
30890 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
308a0 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
308b0 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
308c0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
308d0 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
308e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
308f0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
30900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30910 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d     iOvflSpace +=
30920 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
30930 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
30940 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
30950 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
30960 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
30970 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  e );.      rc = 
30980 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
30990 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
309a0 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65  , sz, pTemp, pNe
309b0 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
309c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
309d0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
309e0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
309f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30a00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30a10 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
30a20 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
30a30 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
30a40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
30a50 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
30a60 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
30a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
30a80 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
30a90 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
30aa0 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
30ab0 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
30ac0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
30ad0 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
30ae0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
30af0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
30b00 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
30b10 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
30b20 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
30b30 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
30b40 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
30b50 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
30b60 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
30b70 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
30b80 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
30b90 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
30ba0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
30bb0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
30bc0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
30bd0 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
30be0 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
30bf0 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
30c00 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
30c10 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
30c20 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
30c30 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
30c40 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
30c50 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
30c60 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
30c70 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
30c80 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
30c90 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
30ca0 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
30cb0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
30cc0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
30cd0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
30ce0 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
30cf0 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
30d00 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
30d10 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
30d20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
30d30 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
30d40 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
30d50 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
30d60 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
30d70 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
30d80 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
30d90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
30da0 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
30db0 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
30dc0 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
30dd0 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
30de0 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
30df0 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
30e00 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
30e10 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
30e20 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
30e30 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
30e40 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
30e50 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
30e60 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
30e70 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
30e80 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
30e90 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
30ea0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
30eb0 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
30ec0 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
30ed0 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
30ee0 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
30ef0 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
30f00 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
30f10 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
30f20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
30f30 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  rc = copyNodeCon
30f40 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70  tent(apNew[0], p
30f50 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20  Parent)) ){.    
30f60 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
30f70 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d  apNew[0]);.    }
30f80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41  .  }else if( ISA
30f90 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
30fa0 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e   /* Fix the poin
30fb0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
30fc0 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  for all the cell
30fd0 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66  s that were shif
30fe0 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20  ted around. .   
30ff0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65   ** There are se
31000 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
31010 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72  types of pointer
31020 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61  -map entries tha
31030 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  t need to.    **
31040 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
31050 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
31060 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61  Some of these ha
31070 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65  ve been set alre
31080 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20  ady, but.    ** 
31090 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
310a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
310b0 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a  a summary:.    *
310c0 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68  *.    **   1) Th
310d0 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
310e0 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69  ated with new si
310f0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74  bling pages that
31100 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a   were not.    **
31110 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77        siblings w
31120 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
31130 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68  n was called. Th
31140 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ese have already
31150 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65  .    **      bee
31160 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20  n set. We don't 
31170 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62  need to worry ab
31180 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73  out old siblings
31190 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a   that were.    *
311a0 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20  *      moved to 
311b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20  the free-list - 
311c0 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63  the freePage() c
311d0 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61  ode has taken ca
311e0 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  re.    **      o
311f0 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a  f those..    **.
31200 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20      **   2) The 
31210 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31220 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
31230 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
31240 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20  erflow.    **   
31250 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f     page in any o
31260 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75  verflow chains u
31270 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64  sed by new divid
31280 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20  er cells. These 
31290 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76  .    **      hav
312a0 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62  e also already b
312b0 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f  een taken care o
312c0 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  f by the insertC
312d0 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20  ell() code..    
312e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49  **.    **   3) I
312f0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
31300 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
31310 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
31320 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20  ld pages of.    
31330 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74  **      cells st
31340 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c  ored on the sibl
31350 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65  ing pages may ne
31360 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
31370 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31380 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c    4) If the sibl
31390 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
313a0 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65  t internal intke
313b0 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e  y nodes, then an
313c0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76  y.    **      ov
313d0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
313e0 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
313f0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
31400 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20  updated.    **  
31410 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e      (internal in
31420 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72  tkey nodes never
31430 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
31440 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  s to overflow pa
31450 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ges)..    **.   
31460 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20   **   5) If the 
31470 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
31480 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
31490 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
314a0 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65  ap.    **      e
314b0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72  ntries for the r
314c0 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73  ight-child pages
314d0 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67   of each sibling
314e0 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
314f0 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61        to be upda
31500 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
31510 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32  ** Cases 1 and 2
31520 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20   are dealt with 
31530 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63  above by other c
31540 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20  ode. The next.  
31550 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73    ** block deals
31560 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e   with cases 3 an
31570 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20  d 4 and the one 
31580 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65  after that, case
31590 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a   5. Since.    **
315a0 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74   setting a point
315b0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20  er map entry is 
315c0 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70  a relatively exp
315d0 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
315e0 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f  , this.    ** co
315f0 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69  de only sets poi
31600 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
31610 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76   for child or ov
31620 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
31630 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63  t have.    ** ac
31640 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74  tually moved bet
31650 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
31660 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
31670 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20  w = apNew[0];.  
31680 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
31690 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20  = apCopy[0];.   
316a0 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d   int nOverflow =
316b0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
316c0 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f  ;.    int iNextO
316d0 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ld = pOld->nCell
316e0 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20   + nOverflow;.  
316f0 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20    int iOverflow 
31700 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70  = (nOverflow ? p
31710 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
31720 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d  x : -1);.    j =
31730 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31750 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27  /* Current 'old'
31760 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
31770 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20  .    k = 0;     
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
317a0 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67  nt 'new' sibling
317b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72   page */.    for
317c0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26  (i=0; i<nCell &&
317d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
317e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
317f0 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20  isDivider = 0;. 
31800 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69       while( i==i
31810 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20  NextOld ){.     
31820 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
31830 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
31840 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
31850 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
31860 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  old.        ** s
31870 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49  ibling page j. I
31880 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
31890 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
318a0 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
318b0 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
318c0 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61  , then cell i wa
318d0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
318e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c  . */.        pOl
318f0 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b  d = apCopy[++j];
31900 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c  .        iNextOl
31910 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  d = i + !leafDat
31920 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  a + pOld->nCell 
31930 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  + pOld->nOverflo
31940 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  w;.        if( p
31950 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  Old->nOverflow )
31960 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65  {.          nOve
31970 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
31980 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
31990 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69     iOverflow = i
319a0 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
319b0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
319c0 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
319d0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
319e0 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
319f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
31a00 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
31a10 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
31a20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
31a30 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
31a40 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
31a50 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  ==pOld->aOvfl[1]
31a60 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61  .idx-1);.      a
31a70 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
31a80 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  3 || pOld->aOvfl
31a90 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [1].idx==pOld->a
31aa0 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[2].idx-1);.
31ab0 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
31ac0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
31ad0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
31ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
31af0 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
31b00 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
31b10 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
31b20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31b30 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
31b40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
31b50 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
31b60 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
31b70 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
31b80 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
31b90 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
31ba0 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
31bb0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
31bc0 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
31bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
31be0 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
31bf0 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
31c00 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
31c10 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
31c20 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
31c30 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
31c40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31c50 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
31c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31c70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31c80 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20  j<nOld );.      
31c90 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29  assert( k<nNew )
31ca0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
31cb0 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67  he cell was orig
31cc0 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63  inally divider c
31cd0 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20  ell (and is not 
31ce0 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a  now) or.      **
31cf0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
31d00 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c  l, or if the cel
31d10 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  l was located on
31d20 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62   a different sib
31d30 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61  ling.      ** pa
31d40 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  ge before the ba
31d50 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68  lancing, then th
31d60 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
31d70 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
31d80 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61  .      ** with a
31d90 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  ny child or over
31da0 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20  flow pages need 
31db0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20  to be updated.  
31dc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
31dd0 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e  ivider || pOld->
31de0 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
31df0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
31e00 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
31e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31e20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
31e30 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c   get4byte(apCell
31e40 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [i]), PTRMAP_BTR
31e50 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  EE, pNew->pgno);
31e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31e70 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d     if( szCell[i]
31e80 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
31e90 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
31ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31eb0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
31ec0 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
31ed0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
31ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
31ef0 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
31f00 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
31f10 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
31f20 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77  ITE_OK && i<nNew
31f30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
31f40 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 0a  rc = ptrmapPut(.
31f50 09 20 20 20 20 70 42 74 2c 20 67 65 74 34 62 79  .    pBt, get4by
31f60 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44  te(&apNew[i]->aD
31f70 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f  ata[8]), PTRMAP_
31f80 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
31f90 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
31fa0 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
31fb0 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68   /* The ptrmapCh
31fc0 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61  eckPages() conta
31fd0 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61  ins assert() sta
31fe0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72  tements that ver
31ff0 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ify that.    ** 
32000 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  all pointer map 
32010 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f  pages are set co
32020 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73  rrectly. This is
32030 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a   helpful while .
32040 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67      ** debugging
32050 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
32060 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75  y disabled becau
32070 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  se a corrupt dat
32080 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a  abase may.    **
32090 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74   cause an assert
320a0 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  () statement to 
320b0 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74  fail.  */.    pt
320c0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61  rmapCheckPages(a
320d0 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pNew, nNew);.   
320e0 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
320f0 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  s(&pParent, 1);.
32100 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
32110 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
32120 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45  sInit );.  TRACE
32130 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
32140 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  shed: old=%d new
32150 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
32160 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c  .          nOld,
32170 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
32180 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
32190 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
321a0 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
321b0 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
321c0 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
321d0 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
321e0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
321f0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
32200 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
32210 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
32220 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
32230 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
32240 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  i]);.  }..  retu
32250 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
32260 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
32270 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
32280 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
32290 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
322a0 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  e is.** overfull
322b0 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   (has one or mor
322c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
322d0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63  )..**.** A new c
322e0 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c  hild page is all
322f0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63  ocated and the c
32300 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
32310 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70  urrent root.** p
32320 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  age, including o
32330 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61  verflow cells, a
32340 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  re copied into t
32350 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f  he child. The ro
32360 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68  ot.** page is th
32370 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74  en overwritten t
32380 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70  o make it an emp
32390 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65  ty page with the
323a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a   right-child .**
323b0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
323c0 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  g to the new pag
323d0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
323e0 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70  returning, all p
323f0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
32400 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
32410 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68   to pages .** th
32420 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  at the new child
32430 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -page now contai
32440 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
32450 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a  re updated. The.
32460 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70  ** entry corresp
32470 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  onding to the ne
32480 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  w right-child po
32490 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  inter of the roo
324a0 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73  t.** page is als
324b0 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  o updated..**.**
324c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
324d0 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
324e0 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  to contain a ref
324f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68  erence to the ch
32500 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64  ild .** page and
32510 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
32520 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
32530 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
32540 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  is required.** t
32550 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
32560 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64  ge() on *ppChild
32570 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49   exactly once. I
32580 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
32590 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  s,.** an error c
325a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
325b0 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20  and *ppChild is 
325c0 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
325d0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
325e0 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
325f0 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a  pRoot, MemPage *
32600 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74  *ppChild){.  int
32610 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
32620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
32630 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
32640 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
32650 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
32660 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
32670 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
32680 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
32690 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
326a0 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
326b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
326c0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
326d0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
326e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
326f0 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f  pRoot->pBt;    /
32700 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a  * The BTree */..
32710 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
32720 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
32730 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32740 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
32750 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
32760 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68  * Make pRoot, th
32770 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
32780 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61  he b-tree, writa
32790 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20  ble. Allocate a 
327a0 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74  new .  ** page t
327b0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
327c0 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
327d0 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f  ild of pPage. Co
327e0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  py the contents.
327f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65    ** of the node
32800 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74   stored on pRoot
32810 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68   into the new ch
32820 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ild page..  */. 
32830 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
32840 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
32850 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
32860 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53  DbPage)).   || S
32870 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32880 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
32890 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70  e(pBt,&pChild,&p
328a0 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e  gnoChild,pRoot->
328b0 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53  pgno,0)).   || S
328c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
328d0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
328e0 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a  pRoot, pChild)).
328f0 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41 43     || (ISAUTOVAC
32900 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20 53  UUM && .       S
32910 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32920 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
32930 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50  gnoChild, PTRMAP
32940 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70  _BTREE, pRoot->p
32950 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  gno))).  ){.    
32960 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  *ppChild = 0;.  
32970 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
32980 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
32990 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
329a0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
329b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
329c0 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
329d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
329e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
329f0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
32a00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32a10 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52  Child->nCell==pR
32a20 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  oot->nCell );.. 
32a30 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
32a40 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
32a50 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74  nto %d\n", pRoot
32a60 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
32a70 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pgno));..  /* Co
32a80 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  py the overflow 
32a90 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74  cells from pRoot
32aa0 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20   to pChild */.  
32ab0 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
32ac0 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76  Ovfl, pRoot->aOv
32ad0 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  fl, pRoot->nOver
32ae0 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f  flow*sizeof(pRoo
32af0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  t->aOvfl[0]));. 
32b00 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
32b10 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
32b20 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
32b30 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
32b40 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
32b50 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
32b60 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
32b70 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
32b80 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
32b90 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
32ba0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
32bb0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
32bc0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
32bd0 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
32be0 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
32bf0 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
32c00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
32c10 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32c20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
32c30 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
32c40 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
32c50 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
32c60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
32c70 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
32c80 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
32c90 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
32ca0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
32cb0 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
32cc0 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
32cd0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
32ce0 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
32cf0 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
32d00 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
32d10 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
32d20 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
32d30 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
32d40 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
32d50 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32d60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
32d70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
32d80 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
32d90 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
32da0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
32db0 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
32dc0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
32dd0 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
32de0 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
32df0 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
32e00 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
32e10 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
32e20 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
32e30 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
32e40 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
32e50 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
32e60 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
32e70 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
32e80 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
32e90 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
32ea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
32eb0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
32ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32ed0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
32ee0 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
32ef0 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
32f00 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
32f10 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
32f20 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
32f30 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
32f40 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
32f50 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
32f60 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
32f70 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
32f80 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
32f90 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
32fa0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
32fb0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
32fc0 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
32fd0 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20  lance the child 
32fe0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
32ff0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
33000 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ( (balance_deepe
33010 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  r_called++)==0 )
33020 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
33030 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
33040 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  age, &pCur->apPa
33050 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[1]);.        
33060 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
33080 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a  Cur->iPage = 1;.
33090 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
330a0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
330b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
330c0 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[1] = 0;.    
330d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
330e0 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e  ur->apPage[1]->n
330f0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20  Overflow );.    
33100 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
33110 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
33120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33130 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
33140 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
33150 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
33160 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
33170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33180 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
33190 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
331a0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
331b0 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
331c0 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
331d0 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
331e0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
331f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33200 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
33210 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
33230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33240 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
33250 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
33260 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
33270 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
33280 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
33290 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66    && pPage->aOvf
332a0 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
332b0 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
332c0 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
332d0 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=1.         && 
332e0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
332f0 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a  iIdx.        ){.
33300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
33310 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
33320 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  ) to create a ne
33330 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61  w sibling of pPa
33340 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  ge on which.    
33350 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72        ** to stor
33360 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
33370 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69  ell. balance_qui
33380 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e  ck() inserts a n
33390 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  ew cell.        
333a0 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e    ** into pParen
333b0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
333c0 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66  se pParent overf
333d0 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20  low. If this.   
333e0 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
333f0 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65  s, the next inte
33400 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
33410 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
33420 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20  ce pParent .    
33430 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74        ** use eit
33440 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  her balance_nonr
33450 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65  oot() or balance
33460 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c  _deeper(). Until
33470 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
33480 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
33490 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
334a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
334b0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
334c0 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e[].          **
334d0 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20   buffer. .      
334e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
334f0 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20   ** The purpose 
33500 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
33510 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20   assert() is to 
33520 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20  check that only 
33530 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
33540 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61  ingle call to ba
33550 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
33560 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63   made for each c
33570 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
33580 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
33590 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20  n. If this were 
335a0 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20  not verified, a 
335b0 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c  subtle bug invol
335c0 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20  ving reuse.     
335d0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61       ** of the a
335e0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
335f0 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  e[] might sneak 
33600 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  in..          */
33610 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
33620 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63  t( (balance_quic
33630 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  k_called++)==0 )
33640 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
33650 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
33660 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61  Parent, pPage, a
33670 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
33680 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
33690 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
336a0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
336b0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61  In this case, ca
336c0 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ll balance_nonro
336d0 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69  ot() to redistri
336e0 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20  bute cells.     
336f0 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
33700 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
33710 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67  2 of its sibling
33720 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76   pages. This inv
33730 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20  olves.          
33740 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  ** modifying the
33750 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61   contents of pPa
33760 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
33770 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f  cause pParent to
33780 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
33790 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
337a0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20   underfull. The 
337b0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
337c0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20  f the do-loop.  
337d0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
337e0 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
337f0 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65  nt page to corre
33800 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20  ct this..       
33810 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
33820 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   ** If the paren
33830 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
33840 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65  verfull, the ove
33850 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65  rflow cell or ce
33860 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
33870 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
33880 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
33890 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64   allocated immed
338a0 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20  iately below. . 
338b0 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75           ** A su
338c0 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
338d0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
338e0 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68  p will deal with
338f0 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
33900 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61     ** calling ba
33910 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
33920 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28  (balance_deeper(
33930 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
33940 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20  first,.         
33950 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e   ** but it doesn
33960 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65  't deal with ove
33970 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75  rflow cells - ju
33980 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f  st moves them to
33990 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
339a0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e  different page).
339b0 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65   Once this subse
339c0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61  quent call to ba
339d0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
339e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
339f0 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20  s completed, it 
33a00 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61  is safe to relea
33a10 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  se the pSpace bu
33a20 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20  ffer used by.   
33a30 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
33a40 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20  evious call, as 
33a50 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33a60 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65  l data will have
33a70 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20   been .         
33a80 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65   ** copied eithe
33a90 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  r into the body 
33aa0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
33ab0 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e  ge or into the n
33ac0 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ew.          ** 
33ad0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61  pSpace buffer pa
33ae0 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74  ssed to the latt
33af0 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  er call to balan
33b00 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20  ce_nonroot()..  
33b10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33b20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20       u8 *pSpace 
33b30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
33b40 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70  loc(pCur->pBt->p
33b50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
33b60 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
33b70 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74  _nonroot(pParent
33b80 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20  , iIdx, pSpace, 
33b90 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20  iPage==1);.     
33ba0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
33bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
33bc0 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74   If pFree is not
33bd0 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
33be0 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62   to the pSpace b
33bf0 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20  uffer used .    
33c00 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20          ** by a 
33c10 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
33c20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
33c30 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  (). Its contents
33c40 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20   are.           
33c50 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65   ** now stored e
33c60 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61  ither on real da
33c70 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20  tabase pages or 
33c80 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20  within the .    
33c90 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70          ** new p
33ca0 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f  Space buffer, so
33cb0 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c   it may be safel
33cc0 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f  y freed here. */
33cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
33ce0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
33cf0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
33d00 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
33d10 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
33d20 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
33d30 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61  fter the next ca
33d40 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
33d50 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
33d60 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
33d70 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
33d80 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
33d90 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  hever.          
33da0 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20  ** comes first. 
33db0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  */.          pFr
33dc0 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20  ee = pSpace;.   
33dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
33de0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
33df0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  erflow = 0;..   
33e00 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69     /* The next i
33e10 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
33e20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73  do-loop balances
33e30 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
33e40 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61  . */.      relea
33e50 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
33e60 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
33e70 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  --;.    }.  }whi
33e80 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
33e90 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65  K );..  if( pFre
33ea0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
33eb0 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
33ec0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33ed0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  ;.}.../*.** Inse
33ee0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
33ef0 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
33f00 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
33f10 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
33f20 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
33f30 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
33f40 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
33f50 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
33f60 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
33f70 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
33f80 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
33f90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
33fa0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
33fb0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
33fc0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
33fd0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
33fe0 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
33ff0 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
34000 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
34010 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
34020 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
34030 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
34040 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
34050 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
34060 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  th ignored..**.*
34070 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
34080 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
34090 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
340a0 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
340b0 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e  l to.** MovetoUn
340c0 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b  packed() to seek
340d0 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20   cursor pCur to 
340e0 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73  (pKey, nKey) has
340f0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
34100 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b   performed. seek
34110 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65  Result is the se
34120 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75  arch result retu
34130 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65  rned (a negative
34140 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43  .** number if pC
34150 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
34160 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d  entry that is sm
34170 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79  aller than (pKey
34180 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61  , nKey), or.** a
34190 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
341a0 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
341b0 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69  t an etry that i
341c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a  s larger than .*
341d0 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e  * (pKey, nKey)).
341e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
341f0 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
34200 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63  ter is 0, then c
34210 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 20 70  ursor pCur may p
34220 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20  oint to any .** 
34230 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65  entry or to no e
34240 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20  ntry at all. In 
34250 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
34260 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73  unction has to s
34270 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  eek.** the curso
34280 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77  r before the new
34290 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65   key can be inse
342a0 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
342b0 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
342c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
342d0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
342e0 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
342f0 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
34300 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  of this cursor *
34310 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
34320 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
34330 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66     /* The key of
34340 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
34350 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
34360 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
34370 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  a,  /* The data 
34380 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
34390 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  d */.  int nZero
343a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
343b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
343c0 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73  of extra 0 bytes
343d0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
343e0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65  ta */.  int appe
343f0 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20 20 20  ndBias,         
34400 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
34410 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79  f this is likely
34420 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   an append */.  
34430 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20  int seekResult  
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34450 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f  * Result of prio
34460 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  r MovetoUnpacked
34470 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  () call */.){.  
34480 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f  int rc;.  int lo
34490 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a  c = seekResult;.
344a0 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69    int szNew;.  i
344b0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
344c0 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
344d0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
344e0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
344f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
34500 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
34510 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
34520 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
34530 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
34540 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
34550 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
34560 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
34570 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
34580 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
34590 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
345a0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
345b0 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20  Cur->wrFlag );. 
345c0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
345d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
345e0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
345f0 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ot, pCur->pKeyIn
34600 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20  fo!=0, 2) );..  
34610 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
34620 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74   insert into a t
34630 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76  able b-tree, inv
34640 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
34650 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f  blob .  ** curso
34660 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72  rs open on the r
34670 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ow being replace
34680 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73  d (assuming this
34690 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20   is a replace.  
346a0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69  ** operation - i
346b0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
346c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
346d0 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66  no-op).  */.  if
346e0 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
346f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
34700 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
34710 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  sors(p, pCur->pg
34720 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29  noRoot, nKey, 0)
34730 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
34740 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
34750 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
34760 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
34770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  ;.  }..  /* Save
34780 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
34790 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
347a0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
347b0 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
347c0 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  * In some cases,
347d0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72   the call to btr
347e0 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77  eeMoveto() below
347f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72   is a no-op. For
34800 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77  .  ** example, w
34810 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61  hen inserting da
34820 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
34830 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61  with auto-genera
34840 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  ted integer.  **
34850 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20   keys, the VDBE 
34860 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71  layer invokes sq
34870 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29  lite3BtreeLast()
34880 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
34890 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  he .  ** integer
348a0 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20   key to use. It 
348b0 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20  then calls this 
348c0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75  function to actu
348d0 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20  ally insert the 
348e0 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20  .  ** data into 
348f0 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  the intkey B-Tre
34900 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
34910 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65  btreeMoveto() re
34920 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68  cognizes.  ** th
34930 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
34940 20 61 6c 72 65 61 64 79 20 77 68 65 72 65 20 69   already where i
34950 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e  t needs to be an
34960 64 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  d returns withou
34970 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79  t.  ** doing any
34980 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20   work. To avoid 
34990 74 68 77 61 72 74 69 6e 67 20 74 68 65 73 65 20  thwarting these 
349a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69  optimizations, i
349b0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20  t is important. 
349c0 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72   ** not to clear
349d0 20 74 68 65 20 63 75 72 73 6f 72 20 68 65 72 65   the cursor here
349e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20 20 20  ..  */.  if(.   
349f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
34a00 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
34a10 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
34a20 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 20  Root, pCur)) || 
34a30 28 21 6c 6f 63 20 26 26 0a 20 20 20 20 53 51 4c  (!loc &&.    SQL
34a40 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
34a50 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
34a60 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
34a70 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20  ndBias, &loc)). 
34a80 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   )){.    return 
34a90 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
34aa0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
34ab0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
34ac0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
34ad0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26  URSOR_INVALID &&
34ae0 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67   loc) );..  pPag
34af0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
34b00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
34b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34b20 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d  intKey || nKey>=
34b30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34b40 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70  Page->leaf || !p
34b50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
34b60 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54    TRACE(("INSERT
34b70 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d  : table=%d nkey=
34b80 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61  %lld ndata=%d pa
34b90 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ge=%d %s\n",.   
34ba0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
34bb0 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61  oRoot, nKey, nDa
34bc0 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ta, pPage->pgno,
34bd0 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d  .          loc==
34be0 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20  0 ? "overwrite" 
34bf0 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b  : "new entry"));
34c00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34c10 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c  ->isInit );.  al
34c20 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
34c30 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  pBt);.  newCell 
34c40 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
34c50 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
34c60 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
34c70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
34c80 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
34c90 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
34ca0 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
34cb0 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a  Data, nZero, &sz
34cc0 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
34cd0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
34ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
34cf0 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
34d00 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
34d10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
34d20 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
34d30 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  pBt) );.  idx = 
34d40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
34d50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
34d60 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31  loc==0 ){.    u1
34d70 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  6 szOld;.    ass
34d80 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e  ert( idx<pPage->
34d90 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
34da0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34db0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
34dc0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34dd0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
34de0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
34df0 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69      oldCell = fi
34e00 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
34e10 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
34e20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
34e30 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
34e40 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
34e50 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
34e60 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
34e70 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
34e80 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
34e90 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
34ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
34eb0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
34ec0 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c      rc = dropCel
34ed0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a  l(pPage, idx, sz
34ee0 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Old);.    if( rc
34ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  !=SQLITE_OK ) {.
34f00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
34f10 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  nsert;.    }.  }
34f20 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26  else if( loc<0 &
34f30 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  & pPage->nCell>0
34f40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
34f50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
34f60 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d     idx = ++pCur-
34f70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
34f80 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge];.  }else{.  
34f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34fa0 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
34fb0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
34fc0 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65  Page, idx, newCe
34fd0 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
34fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
34ff0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
35000 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70  ge->nCell>0 || p
35010 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
35020 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  0 );..  /* If no
35030 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
35040 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61 73  ed and pPage has
35050 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
35060 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28  l, call balance(
35070 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73  ) .  ** to redis
35080 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c  tribute the cell
35090 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65  s within the tre
350a0 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65  e. Since balance
350b0 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a  () may move.  **
350c0 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72   the cursor, zer
350d0 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  o the BtCursor.i
350e0 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74  nfo.nSize and Bt
350f0 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79  Cursor.validNKey
35100 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e  .  ** variables.
35110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69  .  **.  ** Previ
35120 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ous versions of 
35130 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f  SQLite called mo
35140 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f  veToRoot() to mo
35150 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  ve the cursor.  
35160 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72  ** back to the r
35170 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c 61  oot page as bala
35180 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e  nce() used to in
35190 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e  validate the con
351a0 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74  tents.  ** of Bt
351b0 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20  Cursor.apPage[] 
351c0 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49  and BtCursor.aiI
351d0 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66  dx[]. Instead of
351e0 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a   doing that,.  *
351f0 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72  * set the cursor
35200 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c   state to "inval
35210 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  id". This makes 
35220 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70  common insert op
35230 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c  erations.  ** sl
35240 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20  ightly faster.. 
35250 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69   **.  ** There i
35260 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20 69  s a subtle but i
35270 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a  mportant optimiz
35280 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20  ation here too. 
35290 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20  When inserting. 
352a0 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63   ** multiple rec
352b0 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74  ords into an int
352c0 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67  key b-tree using
352d0 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72   a single cursor
352e0 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61   (as can.  ** ha
352f0 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65  ppen while proce
35300 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54  ssing an "INSERT
35310 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54   INTO ... SELECT
35320 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74  " statement), it
35330 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61  .  ** is advanta
35340 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74  geous to leave t
35350 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
35360 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
35370 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ntry in.  ** the
35380 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69   b-tree if possi
35390 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72 73  ble. If the curs
353a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
353b0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a  ing to the last.
353c0 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68    ** entry in th
353d0 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  e table, and the
353e0 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74   next row insert
353f0 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65  ed has an intege
35400 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65  r key.  ** large
35410 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
35420 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c  st existing key,
35430 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
35440 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20  to insert the.  
35450 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73  ** row without s
35460 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f  eeking the curso
35470 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61  r. This can be a
35480 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65   big performance
35490 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70   boost..  */.  p
354a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
354b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
354c0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
354d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
354e0 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
354f0 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  low ){.    rc = 
35500 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a  balance(pCur);..
35510 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65      /* Must make
35520 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20   sure nOverflow 
35530 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f  is reset to zero
35540 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c   even if the bal
35550 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61  ance().    ** fa
35560 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61  ils. Internal da
35570 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ta structure cor
35580 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  ruption will res
35590 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a  ult otherwise. .
355a0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74      ** Also, set
355b0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
355c0 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68  e to invalid. Th
355d0 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75 72  is stops saveCur
355e0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20  sorPosition().  
355f0 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
35600 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75 72   to save the cur
35610 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
35620 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f   the cursor.  */
35630 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
35640 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
35650 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
35660 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
35670 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
35680 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
35690 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
356a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72  r->iPage]->nOver
356b0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f  flow==0 );..end_
356c0 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e  insert:.  return
356d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
356e0 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74  lete the entry t
356f0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
35700 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
35710 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
35720 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
35730 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f  t a arbitrary lo
35740 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  cation..*/.int s
35750 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
35760 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
35770 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  ){.  Btree *p = 
35780 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
35790 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
357a0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
357b0 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20       .  int rc; 
357c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
357e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
357f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35810 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
35820 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f   delete cell fro
35830 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  m */.  unsigned 
35840 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20  char *pCell;    
35850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
35860 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74  ointer to cell t
35870 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
35880 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20  t iCellIdx;     
35890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
358b0 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ell to delete */
358c0 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74  .  int iCellDept
358d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
358e0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68          /* Depth
358f0 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e   of node contain
35900 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20  ing pCell */ .. 
35910 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
35920 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
35930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
35940 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
35950 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
35960 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
35970 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73  readOnly );.  as
35980 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
35990 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ag );.  assert( 
359a0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
359b0 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d  bleLock(p, pCur-
359c0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d  >pgnoRoot, pCur-
359d0 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29  >pKeyInfo!=0, 2)
359e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68   );.  assert( !h
359f0 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
35a00 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
35a10 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  t) );..  if( NEV
35a20 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ER(pCur->aiIdx[p
35a30 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75  Cur->iPage]>=pCu
35a40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
35a50 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a  iPage]->nCell) .
35a60 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72     || NEVER(pCur
35a70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
35a80 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20  _VALID).  ){.   
35a90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
35aa0 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68  RROR;  /* Someth
35ab0 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72  ing has gone awr
35ac0 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  y. */.  }..  /* 
35ad0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65 6c  If this is a del
35ae0 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ete operation to
35af0 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72   remove a row fr
35b00 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  om a table b-tre
35b10 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61  e,.  ** invalida
35b20 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
35b30 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
35b40 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65  the row being de
35b50 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28  leted.  */.  if(
35b60 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d   pCur->pKeyInfo=
35b70 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  =0 ){.    invali
35b80 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
35b90 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  ors(p, pCur->pgn
35ba0 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66  oRoot, pCur->inf
35bb0 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a  o.nKey, 0);.  }.
35bc0 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20  .  iCellDepth = 
35bd0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69  pCur->iPage;.  i
35be0 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e  CellIdx = pCur->
35bf0 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68  aiIdx[iCellDepth
35c00 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ];.  pPage = pCu
35c10 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44  r->apPage[iCellD
35c20 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d  epth];.  pCell =
35c30 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
35c40 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f   iCellIdx);..  /
35c50 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
35c60 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
35c70 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ry to delete is 
35c80 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
35c90 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63   move.  ** the c
35ca0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72  ursor to the lar
35cb0 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  gest entry in th
35cc0 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20 73  e tree that is s
35cd0 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a  maller than.  **
35ce0 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67   the entry being
35cf0 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63   deleted. This c
35d00 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65  ell will replace
35d10 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20   the cell being 
35d20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f  deleted.  ** fro
35d30 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  m the internal n
35d40 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f  ode. The 'previo
35d50 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73 65  us' entry is use
35d60 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65  d for this inste
35d70 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27  ad.  ** of the '
35d80 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20  next' entry, as 
35d90 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
35da0 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  ry is always a p
35db0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
35dc0 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20  sub-tree headed 
35dd0 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  by the child pag
35de0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65  e of the cell be
35df0 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69  ing deleted. Thi
35e00 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c  s makes.  ** bal
35e10 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65 20  ancing the tree 
35e20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65  following the de
35e30 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65  lete operation e
35e40 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  asier.  */.  if(
35e50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
35e60 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
35e70 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
35e80 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
35e90 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
35ea0 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 29  pCur, &notUsed))
35eb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35ec0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
35ed0 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
35ee0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
35ef0 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
35f00 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
35f10 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69  before.  ** maki
35f20 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ng any modificat
35f30 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70  ions. Make the p
35f40 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
35f50 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a  he entry to be .
35f60 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69    ** deleted wri
35f70 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65  table. Then free
35f80 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
35f90 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
35fa0 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e  ith the .  ** en
35fb0 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  try and finally 
35fc0 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20  remove the cell 
35fd0 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68  itself from with
35fe0 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f  in the page.  */
35ff0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
36000 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
36010 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
36020 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
36030 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
36040 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
36050 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
36060 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20  e->pDbPage)).   
36070 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
36080 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
36090 61 67 65 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20  age, pCell)).   
360a0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
360b0 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  c = dropCell(pPa
360c0 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65  ge, iCellIdx, ce
360d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
360e0 20 70 43 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20   pCell))).  ){. 
360f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36100 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
36110 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61 73 20  ell deleted was 
36120 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  not located on a
36130 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
36140 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a   the cursor.  **
36150 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
36160 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
36170 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74  rgest entry in t
36180 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64  he sub-tree head
36190 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ed.  ** by the c
361a0 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74 68 65  hild-page of the
361b0 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73 20 6a   cell that was j
361c0 75 73 74 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  ust deleted from
361d0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a   an internal.  *
361e0 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c  * node. The cell
361f0 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e   from the leaf n
36200 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ode needs to be 
36210 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69 6e 74  moved to the int
36220 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20  ernal.  ** node 
36230 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 64  to replace the d
36240 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f  eleted cell.  */
36250 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
36260 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  eaf ){.    MemPa
36270 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43 75 72  ge *pLeaf = pCur
36280 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
36290 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  Page];.    int n
362a0 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  Cell;.    Pgno n
362b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
362c0 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70  iCellDepth+1]->p
362d0 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  gno;.    unsigne
362e0 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20  d char *pTmp;.. 
362f0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
36300 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66  ell(pLeaf, pLeaf
36310 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
36320 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  nCell = cellSize
36330 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c  Ptr(pLeaf, pCell
36340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  );.    assert( M
36350 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
36360 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20  >=nCell );..    
36370 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
36380 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54 6d 70  e(pBt);.    pTmp
36390 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
363a0 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e;..    if( SQLI
363b0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
363c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
363d0 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29 29 20  Leaf->pDbPage)) 
363e0 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
363f0 4f 4b 21 3d 28 72 63 20 3d 20 69 6e 73 65 72 74  OK!=(rc = insert
36400 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
36410 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e  lIdx, pCell-4, n
36420 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29  Cell+4, pTmp, n)
36430 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
36440 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70 43  _OK!=(rc = dropC
36450 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66  ell(pLeaf, pLeaf
36460 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c  ->nCell-1, nCell
36470 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
36480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e  .  }..  /* Balan
364a0 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66 20  ce the tree. If 
364b0 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
364c0 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  d was located on
364d0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20 20   a leaf page,.  
364e0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  ** then the curs
364f0 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  or still points 
36500 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49 6e  to that page. In
36510 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
36520 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  irst.  ** call t
36530 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70 61  o balance() repa
36540 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61 6e  irs the tree, an
36550 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f  d the if(...) co
36560 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  ndition is.  ** 
36570 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a  never true..  **
36580 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
36590 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64 65   if the entry de
365a0 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e 20  leted was on an 
365b0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61  internal node pa
365c0 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43  ge, then.  ** pC
365d0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
365e0 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
365f0 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65 6c  from which a cel
36600 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74 6f  l was removed to
36610 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  .  ** replace th
36620 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 66  e cell deleted f
36630 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
36640 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73   node. This is s
36650 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69  lightly.  ** tri
36660 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66 20  cky as the leaf 
36670 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64 65  node may be unde
36680 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69  rfull, and the i
36690 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79  nternal node may
366a0 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72 20  .  ** be either 
366b0 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75 6c  under or overful
366c0 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
366d0 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e  run the balancin
366e0 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a  g algorithm.  **
366f0 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   on the leaf nod
36700 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65 20  e first. If the 
36710 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73  balance proceeds
36720 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74   far enough up t
36730 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61  he.  ** tree tha
36740 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  t we can be sure
36750 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65   that any proble
36760 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  m in the interna
36770 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20  l node has.  ** 
36780 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20  been corrected, 
36790 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77  so be it. Otherw
367a0 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e  ise, after balan
367b0 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f  cing the leaf no
367c0 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68  de,.  ** walk th
367d0 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65 20  e cursor up the 
367e0 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74 65  tree to the inte
367f0 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61  rnal node and ba
36800 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20 2a  lance it as .  *
36810 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63  * well.  */.  rc
36820 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
36830 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
36840 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69  TE_OK && pCur->i
36850 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20  Page>iCellDepth 
36860 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
36870 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44  ur->iPage>iCellD
36880 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72 65  epth ){.      re
36890 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
368a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
368b0 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
368c0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
368d0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
368e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
368f0 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
36900 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
36910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36920 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
36930 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
36940 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
36950 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
36960 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
36970 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
36980 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
36990 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
369a0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
369b0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
369c0 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
369d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
369e0 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
369f0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
36a00 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
36a10 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
36a20 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
36a30 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
36a40 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
36a50 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
36a60 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
36a70 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
36a80 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
36a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36aa0 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
36ab0 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63  ndices.*/.static
36ac0 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65   int btreeCreate
36ad0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
36ae0 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
36af0 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
36b00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36b10 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
36b20 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
36b30 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
36b40 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
36b50 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
36b60 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
36b70 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
36b80 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
36b90 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
36ba0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
36bb0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
36bc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36bd0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
36be0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
36bf0 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
36c00 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
36c10 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
36c20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
36c30 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
36c40 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
36c50 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
36c60 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
36c70 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
36c80 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
36c90 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
36ca0 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
36cb0 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
36cc0 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
36cd0 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
36ce0 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
36cf0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
36d00 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
36d10 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
36d20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
36d30 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
36d40 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
36d50 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
36d60 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
36d70 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
36d80 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
36d90 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
36da0 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
36db0 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
36dc0 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
36dd0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
36de0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
36df0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
36e00 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
36e10 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
36e20 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
36e30 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
36e40 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
36e50 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
36e60 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
36e70 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
36e80 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
36e90 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
36ea0 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
36eb0 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
36ec0 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
36ed0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
36ee0 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52  eta(p, BTREE_LAR
36ef0 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20  GEST_ROOT_PAGE, 
36f00 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
36f10 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..   
36f20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74   /* The new root
36f30 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65  -page may not be
36f40 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20   allocated on a 
36f50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
36f60 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
36f70 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67  PENDING_BYTE pag
36f80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  e..    */.    wh
36f90 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50  ile( pgnoRoot==P
36fa0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
36fb0 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20  , pgnoRoot) ||. 
36fc0 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d         pgnoRoot=
36fd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
36fe0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
36ff0 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20   pgnoRoot++;.   
37000 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
37010 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20  gnoRoot>=3 );.. 
37020 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
37030 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20   page. The page 
37040 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72  that currently r
37050 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f  esides at pgnoRo
37060 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ot will.    ** b
37070 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61  e moved to the a
37080 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75  llocated page (u
37090 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61  nless the alloca
370a0 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73  ted page happens
370b0 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64  .    ** to resid
370c0 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a  e at pgnoRoot)..
370d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
370e0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
370f0 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76  e(pBt, &pPageMov
37100 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67  e, &pgnoMove, pg
37110 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20  noRoot, 1);.    
37120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37130 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
37140 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
37150 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70   if( pgnoMove!=p
37160 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  gnoRoot ){.     
37170 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20   /* pgnoRoot is 
37180 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69  the page that wi
37190 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ll be used for t
371a0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a  he root-page of.
371b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
371c0 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67   table (assuming
371d0 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f   an error did no
371e0 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65  t occur). But we
371f0 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61   were.      ** a
37200 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76  llocated pgnoMov
37210 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28  e. If required (
37220 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e  i.e. if it was n
37230 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  ot allocated.   
37240 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69     ** by extendi
37250 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68  ng the file), th
37260 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61  e current page a
37270 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d  t position pgnoM
37280 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ove.      ** is 
37290 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65  already journale
372a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
372b0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
372c0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
372d0 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ..      releaseP
372e0 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a  age(pPageMove);.
372f0 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74  .      /* Move t
37300 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
37310 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f  y at pgnoRoot to
37320 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20   pgnoMove. */.  
37330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37340 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
37350 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
37360 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
37370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37380 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
37390 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
373a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
373b0 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  et(pBt, pgnoRoot
373c0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
373d0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
373e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
373f0 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
37400 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
37410 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37420 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
37430 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
37440 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37460 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
37470 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
37480 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
37490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
374a0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
374b0 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
374c0 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
374d0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
374e0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
374f0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
37500 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
37510 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30  age, pgnoMove, 0
37520 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
37530 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
37540 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
37550 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
37560 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
37570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37580 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37590 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
375a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
375b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
375c0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
375d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
375e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
375f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37600 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
37610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37620 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
37630 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
37640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37650 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
37660 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
37670 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37680 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
37690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
376a0 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
376b0 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
376c0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
376d0 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
376e0 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
376f0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
37700 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
37710 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
37720 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
37730 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
37740 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37750 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
37760 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
37770 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
37780 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
37790 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
377a0 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
377b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
377c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
377d0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
377e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
377f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
37800 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
37810 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
37820 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
37830 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
37840 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
37850 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
37860 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37870 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
37880 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
37890 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
378a0 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
378b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
378c0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
378d0 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
378e0 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
378f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37900 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
37910 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
37920 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
37930 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
37940 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
37950 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37960 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
37970 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
37980 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
37990 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
379a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
379b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
379c0 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
379d0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
379e0 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
379f0 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
37a00 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
37a10 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
37a20 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
37a30 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
37a40 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
37a50 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
37a60 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
37a70 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
37a80 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
37a90 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37aa0 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
37ab0 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
37ac0 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag,     /* Deall
37ad0 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
37ae0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  ue */.  int *pnC
37af0 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61  hange.){.  MemPa
37b00 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
37b10 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
37b20 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
37b30 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
37b40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
37b50 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
37b60 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
37b70 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
37b80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
37b90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
37ba0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
37bb0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
37bc0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
37bd0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
37be0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37bf0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37c00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
37c10 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
37c20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
37c30 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
37c40 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
37c50 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
37c60 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
37c70 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
37c80 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e  te(pCell), 1, pn
37c90 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69  Change);.      i
37ca0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
37cb0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
37cc0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
37cd0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
37ce0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
37cf0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
37d00 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
37d10 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
37d20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37d30 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
37d40 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
37d50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
37d60 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e  aData[8]), 1, pn
37d70 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28  Change);.    if(
37d80 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
37d90 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
37da0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e  ;.  }else if( pn
37db0 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73  Change ){.    as
37dc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
37dd0 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68  Key );.    *pnCh
37de0 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e  ange += pPage->n
37df0 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Cell;.  }.  if( 
37e00 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
37e10 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
37e20 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
37e30 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69  e if( (rc = sqli
37e40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37e50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d  age->pDbPage))==
37e60 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67  0 ){.    zeroPag
37e70 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
37e80 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c  aData[0] | PTF_L
37e90 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72  EAF);.  }..clear
37ea0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
37eb0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
37ec0 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
37ed0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
37ee0 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  lete all informa
37ef0 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67  tion from a sing
37f00 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
37f10 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c  database.  iTabl
37f20 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  e is.** the page
37f30 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
37f40 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
37f50 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
37f60 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a  utine returns,.*
37f70 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
37f80 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74  is empty, but st
37f90 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ill exists..**.*
37fa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
37fb0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
37fc0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
37fd0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
37fe0 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72  n.** read cursor
37ff0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s on the table. 
38000 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73   Open write curs
38010 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  ors are moved to
38020 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20   the.** root of 
38030 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
38040 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20   If pnChange is 
38050 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
38060 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74  able iTable must
38070 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   be an intkey ta
38080 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ble. The.** inte
38090 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ger value pointe
380a0 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65  d to by pnChange
380b0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
380c0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
380d0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74  .** entries in t
380e0 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
380f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
38100 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
38110 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
38120 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20  t *pnChange){.  
38130 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
38140 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
38150 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
38160 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
38170 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
38180 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a  TRANS_WRITE );..
38190 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20    /* Invalidate 
381a0 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  all incrblob cur
381b0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 61 62  sors open on tab
381c0 6c 65 20 69 54 61 62 6c 65 20 28 61 73 73 75 6d  le iTable (assum
381d0 69 6e 67 20 69 54 61 62 6c 65 0a 20 20 2a 2a 20  ing iTable.  ** 
381e0 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
381f0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2d 20   table b-tree - 
38200 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  if it is not, th
38210 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
38220 20 69 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70   is.  ** a no-op
38230 29 2e 20 20 2a 2f 0a 20 20 69 6e 76 61 6c 69 64  ).  */.  invalid
38240 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
38250 72 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  rs(p, iTable, 0,
38260 20 31 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49   1);..  if( SQLI
38270 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 61 76  TE_OK==(rc = sav
38280 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
38290 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
382a0 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  )) ){.    rc = c
382b0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
382c0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
382d0 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29  le, 0, pnChange)
382e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
382f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
38300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38310 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
38320 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
38330 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
38340 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
38350 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
38360 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
38370 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
38380 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
38390 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
383a0 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20  age 1) is never 
383b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
383c0 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elist..**.** Thi
383d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
383e0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
383f0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
38400 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
38410 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
38420 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  able..**.** If A
38430 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
38440 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  bled and the pag
38450 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e  e at iTable is n
38460 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  ot the last.** r
38470 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
38480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
38490 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f  hen the last roo
384a0 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68  t page .** in th
384b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
384c0 69 73 20 6d