/ Hex Artifact Content
Login

Artifact 88efb67b8816b6e773cfc824916a4a1df1178715:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 36 32 20 32 30 30 39 2f 30  c,v 1.662 2009/0
0190: 37 2f 30 38 20 31 36 3a 35 34 3a 34 30 20 64 72  7/08 16:54:40 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
07c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
07d0: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
07e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
07f0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0800: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0810: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0820: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0830: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0840: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
0850: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0860: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0870: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0880: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0890: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08a0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08b0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08c0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08d0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08e0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08f0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0900: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0910: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0920: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0930: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0940: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0950: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0960: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0970: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0980: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0990: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09a0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
09f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a00: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a10: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a30: 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69  Locks(a).  #defi
0a40: 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  ne downgradeAllS
0a50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0a60: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0a70: 65 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  e hasSharedCache
0a80: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c  TableLock(a,b,c,
0a90: 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68  d) 1.  #define h
0aa0: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
0ab0: 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a  a, b) 0.#endif..
0ac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ad0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0ae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0af0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
0b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0b10: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0b20: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0b30: 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68 65 63  atement. It chec
0b40: 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 6e 65  ks.** that conne
0b50: 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20 74 68  ction p holds th
0b60: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
0b70: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
0b80: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62 2d 74  e to the .** b-t
0b90: 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ree with root pa
0ba0: 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73 6f 2c  ge iRoot. If so,
0bb0: 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
0bc0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  d. Otherwise, fa
0bd0: 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65 78 61  lse. .** For exa
0be0: 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69  mple, when writi
0bf0: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 2d  ng to a table b-
0c00: 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  tree with root-p
0c10: 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a  age iRoot via .*
0c20: 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69  * Btree connecti
0c30: 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  on pBtree:.**.**
0c40: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 53      assert( hasS
0c50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0c60: 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  ock(pBtree, iRoo
0c70: 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b  t, 0, WRITE_LOCK
0c80: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ) );.**.** When 
0c90: 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  writing to an in
0ca0: 64 65 78 20 62 2d 74 72 65 65 20 74 68 61 74 20  dex b-tree that 
0cb0: 72 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61  resides in a sha
0cc0: 72 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20  rable database, 
0cd0: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  the .** caller s
0ce0: 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74  hould have first
0cf0: 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b   obtained a lock
0d00: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20   specifying the 
0d10: 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
0d20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
0d30: 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  g table b-tree. 
0d40: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d50: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d60: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d80: 74 73 20 65 61 63 68 20 62 2d 74 72 65 65 20 61  ts each b-tree a
0d90: 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72  s a separate str
0da0: 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72  ucture. To deter
0db0: 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  mine.** the tabl
0dc0: 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65 73 70  e b-tree corresp
0dd0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
0de0: 64 65 78 20 62 2d 74 72 65 65 20 62 65 69 6e 67  dex b-tree being
0df0: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
0e00: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
0e10: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
0e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
0e30: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
0e40: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
0e50: 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
0e60: 65 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74  ed at page iRoot
0e70: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
0e80: 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65  .** hold a write
0e90: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
0ea0: 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20  ema table (root 
0eb0: 70 61 67 65 20 31 29 2e 20 54 68 69 73 20 69 73  page 1). This is
0ec0: 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61   also.** accepta
0ed0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0ee0: 6e 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68  nt hasSharedCach
0ef0: 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74  eTableLock(.  Bt
0f00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
0f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
0f20: 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f  hat must hold lo
0f30: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ck */.  Pgno iRo
0f40: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot,            /
0f50: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62  * Root page of b
0f60: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
0f70: 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  sIndex,         
0f80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f    /* True if iRo
0f90: 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f  ot is the root o
0fa0: 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  f an index b-tre
0fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b  e */.  int eLock
0fc0: 54 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Type          /*
0fd0: 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74   Required lock t
0fe0: 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  ype (READ_LOCK o
0ff0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f  r WRITE_LOCK) */
1000: 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  .){.  Schema *pS
1010: 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20  chema = (Schema 
1020: 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  *)pBtree->pBt->p
1030: 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69  Schema;.  Pgno i
1040: 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  Tab = 0;.  BtLoc
1050: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  k *pLock;..  /* 
1060: 49 66 20 74 68 69 73 20 62 2d 74 72 65 65 20 64  If this b-tree d
1070: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73  atabase is not s
1080: 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20  hareable, or if 
1090: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
10a0: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68  ading.  ** and h
10b0: 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  as the read-unco
10c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
10d0: 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69  , then no lock i
10e0: 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a  s required. .  *
10f0: 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1100: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   return true imm
1110: 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20 74 68  ediately.  If th
1120: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1130: 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77 72 69  ing .  ** or wri
1140: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
1150: 74 72 65 65 2c 20 62 75 74 20 74 68 65 20 73 63  tree, but the sc
1160: 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f 61 64  hema is not load
1170: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ed, then return.
1180: 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f 2e 20    ** true also. 
1190: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11a0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
11b0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 74 6f 6f  d, but it is too
11c0: 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a 2a 20   difficult.  ** 
11d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
11e0: 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  client actually 
11f0: 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73 20 64  holds it. This d
1200: 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20 76 65  oesn't happen ve
1210: 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e 20 20  ry.  ** often.  
1220: 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65 65  */.  if( (pBtree
1230: 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a 20  ->sharable==0). 
1240: 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65 3d    || (eLockType=
1250: 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28 70  =READ_LOCK && (p
1260: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1270: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1280: 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20 20 7c  committed)).   |
1290: 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20 28 21  | (isIndex && (!
12a0: 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68  pSchema || (pSch
12b0: 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63  ema->flags&DB_Sc
12c0: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 29  hemaLoaded)==0 )
12d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
12e0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
12f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1300: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1310: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
1320: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
1330: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
1340: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
1350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1360: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
1370: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1380: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1390: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
13a0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
13b0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
13c0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
13d0: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
13e0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
13f0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1400: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1410: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
1420: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
1430: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
1440: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
1450: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
1460: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
1470: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 52  ( pIdx->tnum==iR
1480: 6f 6f 74 20 29 7b 0a 09 69 54 61 62 20 3d 20 70  oot ){..iTab = p
1490: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
14a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
14b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
14c0: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
14d0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
14e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
14f0: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
1500: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
1510: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
1520: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
1530: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
1540: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
1550: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1560: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1570: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1580: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1590: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
15a0: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
15b0: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
15c0: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
15d0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
15e0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
15f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1600: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1610: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1620: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1630: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1640: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1650: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1660: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1670: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
16a0: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
16b0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
16c0: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
16d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
16f0: 73 6f 20 75 73 65 64 20 61 73 20 70 61 72 74 20  so used as part 
1700: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
1710: 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20  ements only. It 
1720: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
1730: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  one or more curs
1750: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1760: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
1770: 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74  oot page iRoot t
1780: 68 61 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e  hat do not belon
1790: 67 20 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e  g to either conn
17a0: 65 63 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a  ection pBtree .*
17b0: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
17c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
17d0: 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63  has the read-unc
17e0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
17f0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  t..**.** For exa
1800: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1810: 74 69 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f  ting to page iRo
1820: 6f 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ot:.**.**    ass
1830: 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
1840: 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20 69  flicts(pBtree, i
1850: 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  Root) );.*/.stat
1860: 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f  ic int hasReadCo
1870: 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70  nflicts(Btree *p
1880: 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f  Btree, Pgno iRoo
1890: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  p;.  for(p=pBtre
18b0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
18e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20  Root==iRoot .   
18f0: 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d    && p->pBtree!=
1900: 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20 30  pBtree.     && 0
1910: 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62  ==(p->pBtree->db
1920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1930: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1940: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1950: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1970: 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69  .#endif    /* #i
1980: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1990: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  G */../*.** Quer
19a0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
19b0: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
19c0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19d0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
19e0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
19f0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
1a00: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1a10: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
1a20: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
1a30: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
1a40: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
1a50: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
1a60: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a70: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
1a80: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
1aa0: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ab0: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
1ac0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
1ad0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
1ae0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1af0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1b00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b10: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b20: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1b30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1b40: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1b50: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1b60: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
1b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 70  );.  assert( !(p
1b80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1b90: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1ba0: 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  ed)||eLock==WRIT
1bb0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
1bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
1bd0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
1be0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
1bf0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
1c00: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
1c10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1c20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
1c30: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
1c40: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
1c50: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
1c60: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
1c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c80: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
1c90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ca0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1cb0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
1cc0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
1cd0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
1ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1cf0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1d00: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d10: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d20: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
1d30: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1d40: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1d50: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1d60: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1d70: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
1d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
1da0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1db0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
1dc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1dd0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
1de0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
1df0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
1e00: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
1e10: 69 74 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e  iter!=p && pBt->
1e20: 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1e30: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1e40: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1e50: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
1e60: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
1e70: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1e80: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
1e90: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1ea0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1eb0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1ec0: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
1ed0: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
1ee0: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
1ef0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f00: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
1f20: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
1f30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1f40: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
1f50: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1f60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f70: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
1f80: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
1f90: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
1fa0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
1fb0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1fc0: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
1fd0: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
1fe0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
1ff0: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2000: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2010: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
2020: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
2030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2040: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
2060: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
2070: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2080: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2090: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
20a0: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
20b0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
20c0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
20d0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
20e0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
20f0: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2100: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2110: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
2120: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
2130: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
2140: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
2150: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2160: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
2170: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2180: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2190: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
21a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21c0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
21d0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
21e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2200: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2210: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2230: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2240: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2250: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2260: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2270: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
2280: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
2290: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
22a0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
22b0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
22c0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
22d0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
22e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2300: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2310: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
2320: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
2330: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79  SQLITE_NOMEM may
2340: 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65   also be returne
2350: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2360: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2370: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
2380: 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20  p, Pgno iTable, 
2390: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
23a0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23b0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
23c0: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f  Lock = 0;.  BtLo
23d0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
23e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23f0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
2410: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2420: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2430: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2440: 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f  p->db!=0 );..  /
2450: 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  * A connection w
2460: 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63  ith the read-unc
2470: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
2480: 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79  t will never try
2490: 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20   to.  ** obtain 
24a0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e  a read-lock usin
24b0: 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
24c0: 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c   The only read-l
24d0: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a  ock obtained.  *
24e0: 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f  * by a connectio
24f0: 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d  n in read-uncomm
2500: 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e  itted mode is on
2510: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2520: 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  er .  ** table, 
2530: 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73  and that lock is
2540: 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72   obtained in Btr
2550: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20  eeBeginTrans(). 
2560: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
2570: 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  =(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d  itted) || eLock=
25a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  =WRITE_LOCK );..
25b0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
25c0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
25d0: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
25e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
25f0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2600: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2610: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
2620: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  sert( SQLITE_OK=
2630: 3d 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68  =querySharedCach
2640: 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
2650: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
2660: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
2670: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
2680: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
2690: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
26a0: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
26b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
26c0: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
26d0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
26e0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
26f0: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
2700: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
2710: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
2720: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2740: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
2750: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
2760: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
2770: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
2780: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
2790: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
27a0: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
27b0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
27c0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
27d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
27e0: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
27f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2800: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
2810: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
2820: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2830: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2840: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
2850: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
2860: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
2870: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
2880: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
2890: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
28a0: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
28b0: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
28c0: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
28d0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
28e0: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
28f0: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
2900: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
2910: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
2920: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
2930: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
2940: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
2950: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
2960: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
2970: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
2980: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
2990: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
29a0: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
29b0: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
29c0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
29d0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
29e0: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
29f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
2a10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2a20: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2a50: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
2a60: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
2a70: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
2a80: 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68  a calls to.** th
2a90: 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  e setSharedCache
2aa0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63  TableLock() proc
2ab0: 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42  edure) held by B
2ac0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a  tree handle p..*
2ad0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ae0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
2af0: 68 61 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20  handle p has an 
2b00: 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69  open read or wri
2b10: 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  te .** transacti
2b20: 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  on. If it does n
2b30: 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53  ot, then the BtS
2b40: 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20  hared.isPending 
2b50: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20  variable.** may 
2b60: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
2b70: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
2b80: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
2b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2ba0: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
2bb0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2bc0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2bd0: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
2be0: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
2bf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2c00: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2c10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2c20: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
2c30: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
2c40: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
2c50: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
2c60: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
2c70: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
2c80: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
2c90: 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69  ( pBt->isExclusi
2ca0: 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ve==0 || pBt->pW
2cb0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
2cc0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
2cd0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
2ce0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
2cf0: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
2d00: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
2d10: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
2d20: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
2d30: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
2d40: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
2d50: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
2d60: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
2d70: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
2d80: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
2d90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
2da0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
2db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2dc0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
2dd0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2de0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
2df0: 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c 7c  >isPending==0 ||
2e00: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
2e10: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
2e20: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
2e30: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
2e40: 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
2e50: 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42  sive = 0;.    pB
2e60: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
2e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
2e80: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
2e90: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
2ea0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2eb0: 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65 63  lled when connec
2ec0: 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c 75  tion p is conclu
2ed0: 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a 2a  ding its .    **
2ee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2ef0: 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79   there currently
2f00: 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65 72   exists a writer
2f10: 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20  , and p is not. 
2f20: 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74 65     ** that write
2f30: 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  r, then the numb
2f40: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  er of locks held
2f50: 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
2f60: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  other.    ** tha
2f70: 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75 73  n the writer mus
2f80: 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64 72  t be about to dr
2f90: 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  op to zero. In t
2fa0: 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  his case.    ** 
2fb0: 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69 6e  set the isPendin
2fc0: 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20  g flag to 0..   
2fd0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2fe0: 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  ere is not curre
2ff0: 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74  ntly a writer, t
3000: 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73 50  hen BtShared.isP
3010: 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20 20  ending must.    
3020: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3030: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3040: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3050: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3060: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3070: 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  isPending = 0;. 
3080: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3090: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
30a0: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
30b0: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
30c0: 74 69 6f 6e 20 70 20 74 6f 20 72 65 61 64 2d 6c  tion p to read-l
30d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
30e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
30f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3100: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3110: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3120: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3130: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3140: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3150: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3160: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3170: 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69    pBt->isExclusi
3180: 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  ve = 0;.    pBt-
3190: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
31a0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
31b0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
31c0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
31d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
31e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
31f0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3200: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3210: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3220: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3230: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3240: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3250: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3260: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3270: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3280: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3290: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
32a0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
32b0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
32c0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d  cursor holds a m
32d0: 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
32e0: 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ared.*/.#ifndef 
32f0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
3300: 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  t cursorHoldsMut
3310: 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ex(BtCursor *p){
3320: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3330: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
3340: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  pBt->mutex);.}.#
3350: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
3360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3370: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  BLOB./*.** Inval
3380: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3390: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
33a0: 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43  he for cursor pC
33b0: 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73  ur, if any..*/.s
33c0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
33d0: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
33e0: 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  he(BtCursor *pCu
33f0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
3400: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
3410: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
3420: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
3430: 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
3440: 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >aOverflow = 0;.
3450: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
3460: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
3470: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
3480: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
3490: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68   opened.** on th
34a0: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
34b0: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
34c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
34d0: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
34e0: 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64  owCache(BtShared
34f0: 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
3500: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
3510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3520: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
3530: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
3540: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
3550: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76  >pNext){.    inv
3560: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3570: 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ache(p);.  }.}..
3580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3590: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
35a0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
35b0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
35c0: 20 74 61 62 6c 65 0a 2a 2a 20 62 2d 74 72 65 65   table.** b-tree
35d0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
35e0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
35f0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3600: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3610: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3620: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3630: 64 2e 20 41 72 67 75 6d 65 6e 74 20 70 67 6e 6f  d. Argument pgno
3640: 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  Root is the .** 
3650: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65  root-page of the
3660: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 0a   table b-tree. .
3670: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3680: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3690: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
36a0: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
36b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
36c0: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
36d0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
36e0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
36f0: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3700: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3710: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3720: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3730: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3740: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3750: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3760: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3770: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3780: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3790: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
37a0: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
37b0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
37c0: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
37d0: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
37e0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
37f0: 20 6f 6e 20 74 68 69 73 20 73 70 65 63 69 66 69   on this specifi
3800: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
3810: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3820: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
3830: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
3840: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3850: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3860: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
3870: 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
3880: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f        /* Look fo
3890: 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  r read cursors o
38a0: 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  n this btree */.
38b0: 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20    i64 iRow,     
38c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
38d0: 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
38e0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
38f0: 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61  .  int isClearTa
3900: 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ble        /* Tr
3910: 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  ue if all rows a
3920: 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  re being deleted
3930: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
3940: 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
3950: 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
3960: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
3970: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3980: 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
3990: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
39a0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
39b0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
39c0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
39d0: 6c 65 20 26 26 20 28 69 73 43 6c 65 61 72 54 61  le && (isClearTa
39e0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
39f0: 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20  Key==iRow) ){.  
3a00: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
3a10: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3a20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
3a30: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  se.  #define inv
3a40: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3a50: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3a60: 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  e invalidateAllO
3a70: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3a80: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3a90: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
3aa0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
3ab0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62  dif../*.** Set b
3ac0: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
3ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3af0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
3b00: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
3b10: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
3b20: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
3b30: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
3b40: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
3b50: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
3b60: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3b70: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
3b80: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
3b90: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
3ba0: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
3bb0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
3bc0: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
3bd0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
3be0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
3bf0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
3c00: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
3c10: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
3c20: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
3c30: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
3c40: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
3c50: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
3c60: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
3c70: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
3c80: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
3c90: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
3ca0: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
3cb0: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
3cc0: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
3cd0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
3ce0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
3cf0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
3d00: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
3d10: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
3d20: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
3d30: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
3d40: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
3d50: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
3d60: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
3d70: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
3d80: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
3d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
3da0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
3db0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
3dc0: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
3dd0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
3de0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
3df0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
3e00: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
3e10: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
3e20: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
3e30: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
3e40: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
3e50: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
3e60: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
3e70: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
3e80: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
3e90: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
3ea0: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
3eb0: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
3ec0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
3ed0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
3ee0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
3ef0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
3f00: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
3f10: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
3f20: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
3f30: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
3f40: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
3f50: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
3f60: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
3f70: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
3f80: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
3f90: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
3fa0: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
3fb0: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
3fc0: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
3fd0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
3fe0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
3ff0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
4000: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
4010: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
4020: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4030: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4040: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4050: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4060: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4070: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4080: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4090: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
40a0: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
40b0: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
40c0: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
40d0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
40e0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
40f0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
4100: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
4110: 6d 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  mmitted if the c
4120: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4130: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4140: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4150: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4160: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4170: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4180: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4190: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
41a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
41b0: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
41c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
41d0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
41e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
41f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4200: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   ){.    int nPag
4220: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
4230: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
4240: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
4250: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4270: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 48 61 73  .      pBt->pHas
4280: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4290: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 28 75  3BitvecCreate((u
42a0: 33 32 29 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  32)nPage);.     
42b0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
42c0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
42d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
42e0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
42f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4310: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
4320: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4330: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4340: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4350: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4360: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4370: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4380: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4390: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
43a0: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
43b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
43c0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
43d0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
43e0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
43f0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4400: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4410: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4420: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4430: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4440: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4450: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4460: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4470: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4480: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
44a0: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
44b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
44c0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
44d0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
44e0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
44f0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4500: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4510: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4520: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4530: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4540: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4550: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4560: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4570: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4580: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4590: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
45a0: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
45b0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
45c0: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
45d0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
45e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
45f0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4600: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4610: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4620: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4630: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4640: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4650: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4660: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4670: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4680: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4690: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
46a0: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
46b0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
46c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
46d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
46e0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
46f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4700: 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
4710: 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
4720: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
4730: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
4740: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
4750: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
4760: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
4770: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
4780: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
4790: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
47a0: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
47b0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
47c0: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
47d0: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
47e0: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
47f0: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
4800: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
4810: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
4820: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
4830: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
4840: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
4850: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
4860: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
4870: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
4880: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
4890: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
48a0: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
48b0: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
48c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
48d0: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
48e0: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
48f0: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
4900: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
4910: 6c 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e  loc( (int)pCur->
4920: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
4930: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
4940: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
4950: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
4960: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
4970: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
4980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4990: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
49a0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
49b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
49c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
49d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
49e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
49f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
4a10: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
4a20: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
4a30: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
4a40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4a50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
4a60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4a70: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4a80: 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
4a90: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4aa0: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43  ge[i]);.      pC
4ab0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4ac0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  0;.    }.    pCu
4ad0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
4ae0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
4af0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
4b00: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
4b10: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
4b20: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
4b30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4b40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
4b50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
4b60: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
4b70: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
4b80: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
4b90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
4ba0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
4bb0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
4bc0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
4bd0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
4be0: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
4bf0: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
4c00: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
4c10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
4c20: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
4c30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4c40: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
4c50: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
4c60: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4c70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4c80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
4c90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
4ca0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
4cb0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
4cc0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
4cd0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
4ce0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
4cf0: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
4d00: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
4d10: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
4d20: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
4d30: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
4d40: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
4d50: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
4d60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
4d70: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
4d80: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
4d90: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4da0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4db0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4dc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
4dd0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
4de0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
4df0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4e00: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
4e10: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4e20: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
4e30: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
4e40: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
4e50: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
4e60: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
4e70: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
4e80: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
4e90: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
4ea0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
4eb0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
4ec0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
4ed0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
4ee0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
4ef0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
4f00: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
4f10: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
4f20: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
4f30: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
4f40: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
4f50: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
4f60: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
4f70: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
4f80: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
4f90: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
4fa0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
4fb0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
4fc0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
4fd0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
4fe0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
4ff0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5000: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5010: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5020: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5030: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5040: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5050: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5060: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5070: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5080: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5090: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
50a0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
50b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
50c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
50d0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
50e0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
50f0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5100: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5110: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5120: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5130: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5140: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5150: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5160: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
5170: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5180: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5190: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
51a0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
51b0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
51c0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
51d0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
51e0: 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
5210: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
5220: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
5230: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
5240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
5260: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5270: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5280: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5290: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
52a0: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
52b0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
52c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
52d0: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
52e0: 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
52f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5300: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
5310: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
5320: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
5330: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
5340: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
5350: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
5360: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
5370: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
5380: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
5390: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
53a0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
53b0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
53c0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
53d0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
53e0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
53f0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
5400: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5410: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
5420: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
5430: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
5440: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
5450: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5460: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5470: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
5480: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5490: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
54a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
54b0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
54c0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
54d0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
54e0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
54f0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
5500: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
5510: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
5520: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
5530: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
5540: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
5550: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
5560: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
5570: 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ip);.  if( rc==S
5580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5590: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55a0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
55b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
55c0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
55d0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
55e0: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
55f0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
5600: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
5610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
5620: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
5630: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
5640: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
5650: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
5660: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  ? \.         sql
5670: 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65  ite3BtreeRestore
5680: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5690: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
56a0: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
56b0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
56c0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
56d0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
56e0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  m the position i
56f0: 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c  t.** was last pl
5700: 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72  aced at.  Cursor
5710: 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20  s can move when 
5720: 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65  the row they are
5730: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20   pointing.** at 
5740: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  is deleted out f
5750: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a  rom under them..
5760: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5770: 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ne returns an er
5780: 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65  ror code if some
5790: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
57a0: 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65  .  The.** intege
57b0: 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20  r *pHasMoved is 
57c0: 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68  set to one if th
57d0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  e cursor has mov
57e0: 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e  ed and 0 if not.
57f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
5800: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
5810: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
5820: 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65  r, int *pHasMove
5830: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  d){.  int rc;.. 
5840: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
5850: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
5860: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
5870: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5880: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
5890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
58b0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
58c0: 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a  skip!=0 ){.    *
58d0: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
58e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61   }else{.    *pHa
58f0: 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  sMoved = 0;.  }.
5900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5910: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
5920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5930: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
5940: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
5950: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
5960: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
5970: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
5980: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
5990: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
59a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
59b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
59c0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
59d0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
59e0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
59f0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5a00: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
5a10: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
5a20: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
5a30: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
5a40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5a50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5a60: 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  ) );.  nPagesPer
5a70: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
5a80: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
5a90: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
5aa0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
5ab0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
5ac0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
5ad0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
5ae0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
5af0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
5b00: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
5b10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
5b20: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
5b30: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
5b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5b60: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
5b70: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
5b80: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
5b90: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
5ba0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
5bb0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
5bc0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
5bd0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20  r 'pgno'..** An 
5be0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
5bf0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
5c00: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
5c10: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
5c20: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
5c30: 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  nt ptrmapPut(BtS
5c40: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5c50: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
5c60: 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20  Pgno parent){.  
5c70: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
5c80: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
5c90: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
5ca0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
5cb0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5cc0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
5cd0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
5ce0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
5cf0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
5d00: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
5d10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5d20: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
5d30: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
5d40: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
5d50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5d60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5d70: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
5d80: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
5d90: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
5da0: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
5db0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
5dc0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
5dd0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
5de0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
5df0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
5e00: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
5e10: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
5e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5e30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5e40: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74  _BKPT;.  }.  iPt
5e50: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
5e60: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
5e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
5e80: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
5e90: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
5ea0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
5eb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5ed0: 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  }.  offset = PTR
5ee0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
5ef0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
5f00: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
5f10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
5f20: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
5f30: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
5f40: 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  t;.  }.  pPtrmap
5f50: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
5f60: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
5f70: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
5f80: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
5f90: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
5fa0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
5fb0: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
5fc0: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
5fd0: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
5fe0: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
5ff0: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
6000: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6010: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6020: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6030: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6040: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6050: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6060: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6070: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6080: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6090: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
60a0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
60b0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
60c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
60d0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
60e0: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
60f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6100: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6110: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
6120: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6130: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
6140: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
6150: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
6160: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
6170: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
6180: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
6190: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
61a0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
61b0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
61c0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
61d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
61e0: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
61f0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6200: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
6210: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
6220: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
6230: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
6240: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6250: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
6260: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6270: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
6280: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
6290: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
62a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
62b0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
62c0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
62d0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
62e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
62f0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6310: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6320: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
6330: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6340: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6350: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6360: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6370: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6380: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
6390: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
63a0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
63b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
63c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
63d0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
63e0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
63f0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6410: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6420: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6430: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6440: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6450: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6460: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6470: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6480: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
6490: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
64a0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
64b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
64c0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
64d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
64e0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
64f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6500: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6510: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6520: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6530: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6540: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6550: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6560: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6570: 74 72 28 78 2c 20 79 29 20 53 51 4c 49 54 45 5f  tr(x, y) SQLITE_
6580: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
6590: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
65a0: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
65b0: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
65c0: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
65d0: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
65e0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
65f0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
6600: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
6610: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
6620: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
6630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6640: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
6650: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
6660: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
6670: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
6680: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49  ine findCell(P,I
6690: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
66a0: 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  a + ((P)->maskPa
66b0: 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28  ge & get2byte(&(
66c0: 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63  P)->aData[(P)->c
66d0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d  ellOffset+2*(I)]
66e0: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )))../*.** This 
66f0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6700: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6710: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6720: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6730: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6740: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6750: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6760: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6770: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6780: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6790: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
67a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
67b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
67c0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
67d0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
67e0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
67f0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
6800: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
6810: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
6820: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
6830: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
6840: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
6850: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
6860: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
6870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
6880: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
6890: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
68a0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
68b0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
68c0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
68d0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
68e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
68f0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
6900: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
6910: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
6920: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
6930: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
6940: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
6950: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
6960: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
6970: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
6980: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
6990: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
69a0: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
69b0: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
69c0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
69d0: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
69e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
69f0: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
6a00: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
6a10: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
6a20: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
6a30: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
6a40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
6a50: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
6a60: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
6a70: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
6a80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6a90: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6aa0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
6ab0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
6ac0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
6ad0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
6ae0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
6af0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
6b00: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
6b10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
6b20: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
6b30: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
6b40: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
6b50: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
6b60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6b70: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
6b80: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
6b90: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
6ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
6bb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
6bc0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
6bd0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
6be0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6bf0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
6c00: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
6c10: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
6c20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6c30: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
6c40: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
6c50: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
6c60: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
6c70: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
6c80: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
6c90: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
6ca0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
6cb0: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e  sData ){.      n
6cc0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
6cd0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
6ce0: 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oad);.    }else{
6cf0: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
6d00: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
6d10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
6d20: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26  Cell[n], (u64*)&
6d30: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
6d40: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
6d50: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c   nPayload;.  }el
6d60: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
6d70: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20  Data = 0;.    n 
6d80: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
6d90: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
6da0: 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ad);.    pInfo->
6db0: 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  nKey = nPayload;
6dc0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  .  }.  pInfo->nP
6dd0: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
6de0: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  d;.  pInfo->nHea
6df0: 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63  der = n;.  testc
6e00: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
6e10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
6e20: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
6e30: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
6e40: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
6e50: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
6e60: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
6e70: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
6e80: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
6e90: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
6ea0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
6eb0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
6ec0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
6ed0: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
6ee0: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
6ef0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
6f00: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
6f10: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
6f20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
6f30: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69  bytes */.    nSi
6f40: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
6f50: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  n;.    pInfo->nL
6f60: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
6f70: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
6f80: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
6f90: 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26      if( (nSize &
6fa0: 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   ~3)==0 ){.     
6fb0: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
6fc0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
6fd0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
6fe0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
6ff0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53  >nSize = (u16)nS
7000: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
7010: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
7020: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
7030: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
7040: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
7050: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
7060: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
7070: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
7080: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
7090: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
70a0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
70b0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
70c0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
70d0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
70e0: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
70f0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
7100: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
7110: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
7120: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
7130: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
7140: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
7150: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
7160: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
7170: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
7180: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
7190: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
71a0: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
71b0: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
71c0: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
71d0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
71e0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
71f0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
7200: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7210: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7220: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
7230: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
7240: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7250: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7260: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
7270: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
7280: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
7290: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
72a0: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
72b0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
72c0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
72d0: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
72e0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
72f0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
7300: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
7310: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
7320: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7330: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7340: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
7350: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  =maxLocal );.   
7360: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7370: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
7380: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
7390: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
73a0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
73b0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
73c0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
73d0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
73e0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
73f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
7400: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7410: 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e  = (u16)(pInfo->n
7420: 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20  Local + n);.    
7430: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
7440: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7450: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
7460: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
7470: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7480: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
7490: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
74a0: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
74b0: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
74c0: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
74d0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
74e0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
74f0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
7500: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
7510: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
7520: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
7530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7540: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
7550: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
7560: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7570: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7580: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7590: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
75a0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
75b0: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
75c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
75d0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
75e0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
75f0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
7600: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7610: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
7620: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
7630: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
7640: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
7650: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
7660: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
7670: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
7680: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
7690: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
76a0: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
76b0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
76c0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
76d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
76e0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
76f0: 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c  8 *pIter = &pCel
7700: 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  l[pPage->childPt
7710: 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53  rSize];.  u32 nS
7720: 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ize;..#ifdef SQL
7730: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
7740: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7750: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
7760: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
7770: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
7780: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
7790: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
77a0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
77b0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
77c0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
77d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
77e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
77f0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
7800: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
7810: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
7820: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
7830: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
7840: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
7850: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
7860: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
7870: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
7880: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
7890: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
78a0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
78b0: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
78c0: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
78d0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
78e0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
78f0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7900: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
7910: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
7920: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7930: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
7940: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
7950: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
7960: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
7970: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
7980: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
7990: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
79a0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
79b0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
79c0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
79d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
79e0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
79f0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
7a00: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
7a10: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
7a20: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
7a30: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
7a40: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7a50: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
7a60: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  }..  testcase( n
7a70: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7a80: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
7a90: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7aa0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7ab0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
7ac0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
7ad0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7ae0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7af0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
7b00: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
7b10: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
7b20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7b30: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7b40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7b50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7b60: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
7b70: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7b80: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
7b90: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
7ba0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7bb0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
7bc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7bd0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
7be0: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
7bf0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
7c00: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
7c10: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
7c20: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
7c30: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
7c40: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
7c50: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
7c60: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
7c70: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
7c80: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
7c90: 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ze;.}.#ifndef ND
7ca0: 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20  EBUG.static u16 
7cb0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
7cc0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7cd0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
7ce0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7cf0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
7d00: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
7d10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
7d20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7d30: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
7d40: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
7d50: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
7d60: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
7d70: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
7d80: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
7d90: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7da0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
7db0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
7dc0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
7dd0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
7de0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
7df0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
7e00: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
7e10: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nfo;.  assert( p
7e20: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c  Cell!=0 );.  sql
7e30: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
7e40: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7e50: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
7e60: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
7e70: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
7e80: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
7e90: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
7ea0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
7eb0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
7ec0: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
7ed0: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
7ee0: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72  verflow]);.    r
7ef0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
7f00: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
7f10: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
7f20: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
7f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7f40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
7f50: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
7f60: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
7f70: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
7f80: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
7f90: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
7fa0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
7fb0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
7fc0: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
7fd0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
7fe0: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
7ff0: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
8000: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
8010: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
8020: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8030: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
8040: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
8050: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
8060: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8080: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8090: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
80c0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
80d0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
80f0: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
8100: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
8110: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8120: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8130: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
8140: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
8150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8160: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
8170: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
8180: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
8190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
81a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
81b0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
81c0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
81f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8200: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
8210: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8230: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
8240: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
8250: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
8260: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
8270: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
8280: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
8290: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
82a0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
82b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
82c0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
82d0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
82e0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
82f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
8300: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
8310: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
8320: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
8330: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8340: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8350: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8360: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8370: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
8380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8390: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
83a0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
83b0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
83c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
83d0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
83e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
83f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8400: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8410: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
8420: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
8430: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
8440: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
8450: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
8460: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8470: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
8480: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
8490: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
84a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
84b0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
84c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
84d0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
84e0: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
84f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
8500: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
8510: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
8520: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
8530: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
8540: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
8550: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
8560: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
8570: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
8580: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
8590: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
85a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
85b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
85c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
85d0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
85e0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
85f0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
8600: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
8610: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
8620: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
8630: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
8640: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8650: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8660: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8670: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
8680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8690: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
86a0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
86b0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
86c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
86d0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 73 71  n verified in sq
86e0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
86f0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53  ge().    ** if S
8700: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8710: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8720: 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20   is defined .   
8730: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
8740: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
8750: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
8760: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8770: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8780: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8790: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
87a0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
87b0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
87c0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
87d0: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
87e0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
87f0: 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e   size;.#if defin
8800: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8810: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
8820: 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62  HECK).    if( cb
8830: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  rk<iCellFirst ){
8840: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8850: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8860: 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
8870: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
8880: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
8890: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
88a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
88b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
88c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
88d0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
88e0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
88f0: 20 26 26 20 63 62 72 6b 3e 69 43 65 6c 6c 46 69   && cbrk>iCellFi
8900: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
8910: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
8920: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
8930: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
8940: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
8950: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
8960: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
8970: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
8980: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
8990: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
89a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
89b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
89c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
89d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
89e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
89f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
8a00: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
8a10: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
8a20: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
8a30: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
8a40: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
8a50: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
8a60: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
8a70: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
8a80: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
8a90: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
8aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ab0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8ad0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8ae0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
8af0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
8b00: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
8b10: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
8b20: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
8b30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
8b40: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
8b50: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
8b60: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
8b70: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
8b80: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
8b90: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
8ba0: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
8bb0: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
8bc0: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
8bd0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
8be0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
8bf0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
8c00: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
8c10: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
8c20: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
8c30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
8c40: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
8c50: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
8c60: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
8c70: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
8c80: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
8c90: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
8ca0: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
8cb0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
8cc0: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
8cd0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
8ce0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
8cf0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
8d00: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
8d10: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
8d20: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
8d30: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
8d40: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
8d50: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
8d60: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
8d70: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
8d80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8d90: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
8da0: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
8db0: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
8dc0: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
8dd0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
8de0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8df0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
8e00: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
8e10: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
8e20: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
8e30: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
8e40: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8e70: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
8e80: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
8e90: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
8ec0: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
8ed0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8ee0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
8ef0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
8f00: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
8f10: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
8f20: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
8f30: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
8f40: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
8f50: 20 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73   code */.  .  as
8f60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8f70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
8f80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8f90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8fa0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
8fb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8fc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
8fe0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
8ff0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9000: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9010: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9020: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9040: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9050: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
9060: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65  a[hdr+7];.  asse
9070: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
9080: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
9090: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
90a0: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
90b0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
90c0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
90d0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
90e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
90f0: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
9100: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9110: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
9120: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9130: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
9140: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
9150: 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  );..  if( nFrag>
9160: 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  =60 ){.    /* Al
9170: 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20  ways defragment 
9180: 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65  highly fragmente
9190: 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  d pages */.    r
91a0: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
91b0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
91c0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
91d0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
91e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
91f0: 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  5]);.  }else if(
9200: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
9210: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
9220: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
9230: 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f  g for a free slo
9240: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
9250: 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20  satisfy .    ** 
9260: 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65  the request. The
9270: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d   allocation is m
9280: 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ade from the fir
9290: 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20  st free slot in 
92a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74  .    ** the list
92b0: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65   that is large e
92c0: 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64  nough to accomad
92d0: 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  ate it..    */. 
92e0: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
92f0: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
9300: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
9310: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9320: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
9330: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
9340: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9350: 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69  c+2]);     /* Si
9360: 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20  ze of free slot 
9370: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  */.      if( siz
9380: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
9390: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
93a0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
93b0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
93c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
93d0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
93e0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
93f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9400: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9410: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9420: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9430: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9440: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9450: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9460: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9470: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9480: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
9490: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
94a0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
94b0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
94c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
94d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
94e0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
94f0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9500: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9510: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9520: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9530: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9540: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9550: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9560: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9570: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9580: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9590: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
95a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
95b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
95c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
95d0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
95e0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
95f0: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9600: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9610: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9620: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9630: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9640: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9650: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9660: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9670: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9680: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9690: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
96a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
96b0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
96c0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
96d0: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
96e0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
96f0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9700: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9710: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9720: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9730: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9740: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9750: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
9760: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
9770: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9780: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a 70 49 64  5], top);.  *pId
9790: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
97a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
97b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
97c0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
97d0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
97e0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
97f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9800: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
9810: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
9820: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9830: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9840: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9850: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9860: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9870: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9880: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9890: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
98a0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
98b0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
98c0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
98d0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
98e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
98f0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
9900: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
9910: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
9920: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9950: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9960: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9970: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9980: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
99a0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
99b0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
99c0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
99d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
99e0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
99f0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
9a00: 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  t+6+(pPage->leaf
9a10: 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72  ?0:4) );.  asser
9a20: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
9a30: 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )<=pPage->pBt->u
9a40: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
9a50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9a60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9a70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9a80: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
9a90: 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  0 );   /* Minimu
9aa0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9ab0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9ac0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
9ad0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
9ae0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
9af0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
9b00: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
9b10: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
9b20: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
9b30: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
9b40: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
9b50: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
9b60: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
9b70: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
9b80: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
9b90: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
9ba0: 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ocks.  Note that
9bb0: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
9bc0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
9bd0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
9be0: 20 62 79 20 73 71 6c 69 74 65 33 42 74 72 65 65   by sqlite3Btree
9bf0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a  InitPage(),.  **
9c00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
9c10: 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20  tPage() did not 
9c20: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69  detect overlappi
9c30: 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a  ng cells or.  **
9c40: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
9c50: 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c   overlapped cell
9c60: 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  s.   Nor does it
9c70: 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65   detect when the
9c80: 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65  .  ** cell conte
9c90: 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20  nt area exceeds 
9ca0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
9cb0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49   page header.  I
9cc0: 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74  f these.  ** sit
9cd0: 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74  uations arise, t
9ce0: 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69  hen subsequent i
9cf0: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
9d00: 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20   might corrupt. 
9d10: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
9d20: 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64  .  So we do need
9d30: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f   to check for co
9d40: 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73  rruption while s
9d50: 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65  canning.  ** the
9d60: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
9d70: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
9d80: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
9d90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c   = hdr + 1;.  iL
9da0: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
9db0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
9dc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
9dd0: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68  t<=iLast );.  wh
9de0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
9df0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9e00: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
9e10: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69  begin>0 ){.    i
9e20: 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34  f( pbegin<addr+4
9e30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9e40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9e50: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
9e60: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
9e70: 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e   }.  if( pbegin>
9e80: 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74  iLast ){.    ret
9e90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9ea0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
9eb0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
9ec0: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
9ed0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
9ee0: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
9ef0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
9f00: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
9f10: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
9f20: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
9f30: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
9f40: 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e  nFree = pPage->n
9f50: 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65  Free + (u16)size
9f60: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
9f70: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
9f80: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
9f90: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
9fa0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
9fb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9fc0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
9fd0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20  t pnext, psize, 
9fe0: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
9ff0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
a000: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
a010: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
a020: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
a030: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
a040: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
a050: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
a060: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
a070: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
a080: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
a090: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
a0a0: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
a0b0: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
a0c0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
a0d0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ze);.      if( (
a0e0: 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67  frag<0) || (frag
a0f0: 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37  >(int)data[hdr+7
a100: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
a110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a120: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a130: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72  }.      data[hdr
a140: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
a150: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
a160: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
a170: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
a180: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
a190: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
a1a0: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
a1b0: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
a1c0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
a1d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a1e0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
a1f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a200: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
a210: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
a220: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a230: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
a240: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
a250: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
a260: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
a270: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
a280: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
a290: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
a2a0: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
a2b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a2c0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
a2d0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
a2e0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
a2f0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
a300: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
a310: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
a320: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a330: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
a340: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a350: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
a360: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a370: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
a380: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a390: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a3a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
a3b0: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
a3c0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
a3d0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
a3e0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
a3f0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
a400: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
a410: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
a420: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
a430: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
a440: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
a450: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
a460: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
a470: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
a480: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
a490: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
a4a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
a4b0: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
a4c0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
a4d0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
a4e0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
a4f0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
a500: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
a510: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
a520: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
a530: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
a540: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
a550: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
a560: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
a570: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
a580: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
a590: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
a5a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
a5b0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
a5c0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
a5d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a5e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a5f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a600: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
a610: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
a620: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
a630: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
a640: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
a650: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
a660: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
a670: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
a680: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
a690: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
a6a0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
a6b0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
a6c0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
a6d0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
a6e0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
a6f0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
a700: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
a710: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
a720: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
a730: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
a740: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
a750: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
a760: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
a770: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
a780: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
a790: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
a7a0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
a7b0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
a7c0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
a7d0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
a7e0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
a7f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
a800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a810: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
a820: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a830: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a840: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
a850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
a860: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
a870: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
a880: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
a890: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
a8a0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
a8b0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
a8c0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
a8d0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
a8e0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
a8f0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
a900: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
a910: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
a920: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
a930: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
a940: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
a950: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
a960: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
a970: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
a980: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
a990: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
a9a0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
a9b0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
a9c0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
a9d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a9e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a9f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
aa00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
aa10: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
aa20: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
aa30: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
aa40: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
aa50: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
aa60: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
aa70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
aa80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
aa90: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
aaa0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
aab0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
aac0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
aad0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
aae0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
aaf0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
ab00: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
ab10: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
ab20: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
ab30: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
ab40: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
ab50: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
ab60: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
ab70: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
ab80: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
ab90: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
aba0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
abb0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
abc0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
abd0: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
abe0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
abf0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
ac00: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
ac10: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
ac20: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
ac30: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
ac40: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
ac50: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
ac60: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
ac70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac80: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
ac90: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
aca0: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
acb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
acc0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
acd0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
ace0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
acf0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
ad00: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
ad10: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ad20: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
ad30: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
ad40: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
ad50: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ad60: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
ad70: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
ad80: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
ad90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ada0: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
adb0: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
adc0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
add0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
ade0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
adf0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
ae00: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
ae10: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
ae20: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32  Bt->pageSize<=32
ae30: 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65  768 );.    pPage
ae40: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
ae50: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
ae60: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
ae70: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
ae80: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
ae90: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
aea0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
aeb0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
aec0: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
aed0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74  age->leaf;.    t
aee0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
aef0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
af00: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
af10: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
af20: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
af30: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
af40: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
af50: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
af60: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
af70: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
af80: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
af90: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
afa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
afb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
afc0: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
afd0: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
afe0: 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  pBt) );..    /* 
aff0: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
b000: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
b010: 63 61 75 73 65 20 75 73 65 20 74 6f 20 72 65 61  cause use to rea
b020: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
b030: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
b040: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
b050: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
b060: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
b070: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
b080: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
b090: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
b0a0: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
b0b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
b0c0: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
b0d0: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
b0e0: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
b0f0: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
b100: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
b110: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
b120: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
b130: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
b140: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b150: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
b160: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
b170: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
b180: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
b190: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
b1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b1b0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
b1c0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
b1d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
b1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b1f0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
b200: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
b210: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
b220: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
b230: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
b240: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
b250: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
b260: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
b270: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
b280: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b290: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b2a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b2b0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
b2c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
b2d0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
b2e0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
b2f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b310: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
b320: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
b330: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
b340: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
b350: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
b360: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
b370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
b380: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
b390: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b3a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b3b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
b3c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b3d0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
b3e0: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
b3f0: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
b400: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
b410: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
b420: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
b430: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
b440: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
b450: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
b460: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
b470: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
b480: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
b490: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
b4a0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
b4b0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
b4c0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
b4d0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
b4e0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
b4f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b500: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b510: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
b520: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
b530: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
b540: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
b550: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
b560: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
b570: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
b580: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
b590: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
b5a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
b5b0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
b5c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b5d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b5e0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
b5f0: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
b600: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
b610: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
b620: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
b630: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
b640: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
b650: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
b660: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
b670: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
b680: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
b690: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
b6a0: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
b6b0: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
b6c0: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
b6d0: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
b6e0: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
b6f0: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
b700: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
b710: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
b720: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
b730: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
b740: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
b750: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
b760: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
b770: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
b780: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
b790: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
b7a0: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
b7b0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
b7c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b7d0: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
b7e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b7f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b800: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
b810: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
b820: 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
b830: 73 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  st;.    pPage->i
b840: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
b850: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b860: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
b870: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
b880: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
b890: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
b8a0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
b8b0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
b8c0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
b8d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
b8e0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
b8f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b900: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b910: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
b920: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
b930: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
b940: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
b950: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
b960: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b970: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
b980: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
b990: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
b9a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b9b0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
b9d0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
b9e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b9f0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ba00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
ba10: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
ba20: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ba30: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ba40: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ba50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ba60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
ba70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d  >mutex) );.  /*m
ba80: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
ba90: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
baa0: 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20  Size - hdr);*/. 
bab0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
bac0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
bad0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
bae0: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
baf0: 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65  )==0 ?1:0);.  me
bb00: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
bb10: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
bb20: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
bb30: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
bb40: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
bb50: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
bb60: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
bb70: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
bb80: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
bb90: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
bba0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
bbb0: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
bbc0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
bbd0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
bbe0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
bbf0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
bc00: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
bc10: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
bc20: 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  68 );.  pPage->m
bc30: 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70  askPage = pBt->p
bc40: 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70  ageSize - 1;.  p
bc50: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
bc60: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
bc70: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
bc80: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
bc90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
bca0: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
bcb0: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
bcc0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
bcd0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
bce0: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
bcf0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
bd00: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
bd10: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
bd20: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
bd30: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
bd40: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
bd50: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
bd60: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
bd70: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
bd80: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
bd90: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
bda0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
bdb0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
bdc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
bdd0: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
bde0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
bdf0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
be00: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
be10: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
be20: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
be30: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
be40: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
be50: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
be60: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
be70: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
be80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
be90: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
bea0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
beb0: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
bec0: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
bed0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
bee0: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
bef0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
bf00: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
bf10: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
bf20: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
bf30: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
bf40: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
bf50: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
bf60: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
bf70: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
bf80: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
bf90: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
bfa0: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
bfb0: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
bfc0: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
bfd0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
bfe0: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
bff0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
c000: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c010: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
c020: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
c030: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
c040: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
c050: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c060: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
c070: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
c080: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
c090: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
c0a0: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
c0b0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
c0c0: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
c0d0: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
c0e0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
c0f0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
c100: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
c110: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
c120: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c130: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c140: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
c150: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
c160: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
c170: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
c180: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
c190: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
c1a0: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
c1b0: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
c1c0: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
c1d0: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
c1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
c200: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
c210: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
c220: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
c230: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
c240: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
c250: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
c260: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
c270: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
c280: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
c290: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
c2a0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
c2b0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
c2c0: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
c2d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
c2e0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
c2f0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
c300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c310: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c320: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
c330: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
c340: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
c350: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
c360: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
c370: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
c380: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
c390: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
c3a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c3b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c3c0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c3d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
c3e0: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
c3f0: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
c400: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
c410: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
c420: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
c430: 67 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75  gno pagerPagecou
c440: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
c450: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  ){.  int nPage =
c460: 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   -1;.  int rc;. 
c470: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
c480: 61 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  age1 );.  rc = s
c490: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
c4a0: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
c4b0: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73  , &nPage);.  ass
c4c0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
c4d0: 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20  OK || nPage==-1 
c4e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e  );.  return (Pgn
c4f0: 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  o)nPage;.}../*.*
c500: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c510: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
c520: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
c530: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
c540: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
c550: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
c560: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
c570: 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
c580: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
c590: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
c5a0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  InitPage()..*/.s
c5b0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
c5c0: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
c5d0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
c5e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
c5f0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
c600: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
c610: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c620: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
c630: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
c640: 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69  pPage     /* Wri
c650: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
c660: 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ter here */.){. 
c670: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
c680: 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
c690: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c6a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c6b0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
c6c0: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
c6d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c6e0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
c6f0: 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20   /* It is often 
c700: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
c710: 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20 69  e page we want i
c720: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
c730: 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20  he..  ** If so, 
c740: 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e  get it directly.
c750: 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73 20    This saves us 
c760: 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63  from having to c
c770: 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61  all.  ** pagerPa
c780: 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b  gecount() to mak
c790: 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77  e sure pgno is w
c7a0: 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68  ithin limits, wh
c7b0: 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  ich results.  **
c7c0: 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c   in a measureabl
c7d0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  e performance im
c7e0: 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  provements..  */
c7f0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61  .  *ppPage = pPa
c800: 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
c810: 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b  okup(pBt, pgno);
c820: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
c830: 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61      /* Page is a
c840: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 20  lready in cache 
c850: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
c860: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
c870: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20      /* Page not 
c880: 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69  in cache.  Acqui
c890: 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  re it. */.    if
c8a0: 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
c8b0: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
c8c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c8d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c8e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
c8f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
c900: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
c910: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
c920: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c930: 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a  c;.    pPage = *
c940: 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  ppPage;.  }.  if
c950: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
c960: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c970: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
c980: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
c990: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c9a0: 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
c9b0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
c9c0: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
c9d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c9e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
c9f0: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
ca00: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
ca10: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
ca20: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
ca30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ca40: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
ca50: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
ca60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
ca70: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
ca80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ca90: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
caa0: 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
cab0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61  PageRefcount(pPa
cac0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  ge->pDbPage)>1 )
cad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
cae0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
caf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
cb00: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
cb10: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
cb20: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
cb30: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
cb40: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
cb50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
cb60: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
cb70: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
cb80: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
cb90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cba0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
cbb0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
cbc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
cbd0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
cbe0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
cbf0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
cc00: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
cc10: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
cc20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
cc30: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
cc40: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
cc50: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
cc60: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
cc70: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
cc80: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
cc90: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
cca0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
ccb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ccc0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
ccd0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
cce0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
ccf0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
cd00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
cd10: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
cd20: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
cd30: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
cd40: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
cd50: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
cd60: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
cd70: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
cd80: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
cd90: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
cda0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
cdb0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
cdc0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
cdd0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
cde0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
cdf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ce00: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ce10: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ce20: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
ce30: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
ce40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
ce50: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
ce60: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
ce70: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
ce80: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
ce90: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
cea0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
ceb0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
cec0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
ced0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
cee0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
cef0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
cf00: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
cf10: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
cf20: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
cf30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
cf40: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
cf50: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
cf60: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
cf70: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
cf80: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 73 71  that.      ** sq
cf90: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
cfa0: 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
cfb0: 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
cfc0: 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
cfd0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
cfe0: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
cff0: 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
d000: 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
d010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d020: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
d030: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
d040: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
d050: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
d060: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
d070: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
d080: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d090: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
d0a0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
d0b0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
d0c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
d0d0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
d0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d0f0: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
d100: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
d110: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
d120: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
d130: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
d140: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
d150: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
d160: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
d170: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d180: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
d190: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
d1a0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
d1b0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
d1c0: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
d1d0: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
d1e0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
d1f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
d200: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
d210: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
d220: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
d230: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
d240: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
d250: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
d260: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
d270: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
d280: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
d290: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
d2a0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
d2b0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
d2c0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
d2d0: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
d2e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d2f0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
d300: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
d310: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
d320: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
d330: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
d340: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
d350: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
d360: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
d370: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
d380: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
d390: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d3a0: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
d3b0: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
d3c0: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
d3d0: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
d3e0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
d3f0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
d400: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
d410: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
d420: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
d430: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
d440: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d460: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
d470: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d480: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
d490: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d4a0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
d4b0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
d4c0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
d4d0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
d4e0: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
d4f0: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
d500: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
d510: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
d520: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
d530: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
d540: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
d550: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
d560: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
d570: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
d580: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
d590: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
d5a0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
d5b0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
d5c0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
d5d0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
d5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
d5f0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
d600: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d610: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
d620: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
d630: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
d640: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
d650: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d660: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
d670: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
d680: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
d690: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
d6a0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
d6b0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
d6c0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
d6d0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
d6e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
d6f0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
d700: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
d710: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
d720: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
d730: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
d740: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
d750: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
d760: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
d770: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
d780: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
d790: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
d7a0: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
d7b0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
d7c0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
d7d0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
d7e0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
d7f0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
d800: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
d810: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d820: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
d830: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
d840: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d850: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
d860: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
d870: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
d880: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
d890: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
d8a0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
d8b0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
d8c0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
d8d0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
d8e0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
d8f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
d900: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d910: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
d920: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
d930: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
d940: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
d950: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
d960: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
d970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d980: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d990: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
d9a0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
d9b0: 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
d9c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
d9d0: 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
d9e0: 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
d9f0: 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
da00: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
da10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
da20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
da30: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
da40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
da50: 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
da60: 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
da70: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
da80: 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
da90: 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
daa0: 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
dab0: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
dac0: 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
dad0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65  .  */.  if( isMe
dae0: 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e  mdb==0 && zFilen
daf0: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
db00: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73  [0] ){.    if( s
db10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
db20: 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
db30: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69  abled ){.      i
db40: 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
db50: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
db60: 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
db70: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
db80: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
db90: 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (nFullPathname);
dba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
dbb0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
dbc0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
dbd0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
dbe0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
dbf0: 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b  ITE_SharedCache;
dc00: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
dc10: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
dc20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
dc30: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
dc40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dc50: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
dc60: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
dc70: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
dc80: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
dc90: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
dca0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
dcb0: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
dcc0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
dcd0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
dce0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
dcf0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
dd00: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
dd10: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
dd20: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
dd30: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
dd40: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
dd50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
dd60: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
dd70: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
dd80: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
dd90: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
dda0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
ddb0: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
ddc0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
ddd0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
dde0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ddf0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
de00: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
de10: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
de20: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
de40: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
de50: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
de60: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
de70: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
de80: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
de90: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
dea0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
deb0: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
dec0: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
ded0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
dee0: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
def0: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
df00: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
df10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df20: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
df30: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
df40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df50: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
df60: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
df70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
df80: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
df90: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
dfa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dfb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
dfc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dfd0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
dfe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
e000: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e010: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
e020: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
e030: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
e040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e050: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e060: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e070: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e080: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e090: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e0a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e0b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
e0c0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
e0d0: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
e0e0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
e0f0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
e100: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
e110: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
e120: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
e130: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
e140: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
e150: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
e160: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
e170: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e180: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
e190: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
e1a0: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
e1b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e1c0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e1d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e1e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e1f0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
e200: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
e210: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
e220: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
e230: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
e240: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
e250: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
e260: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
e270: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
e280: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
e290: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
e2a0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
e2b0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
e2c0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
e2d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e2e0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
e2f0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
e300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e310: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
e320: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
e330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e340: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
e350: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e360: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
e370: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e380: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
e390: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
e3a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
e3b0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
e3c0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e3d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e3f0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e410: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e420: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
e430: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
e440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e450: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
e460: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
e470: 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  sFlags);.    if(
e480: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e490: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e4a0: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
e4b0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
e4c0: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
e4d0: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
e4e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e4f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e500: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e510: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e520: 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  }.    pBt->db = 
e530: 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
e540: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
e550: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
e560: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
e570: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
e580: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
e590: 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61    .    sqlite3Pa
e5a0: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70  gerSetReiniter(p
e5b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
e5c0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74  Reinit);.    pBt
e5d0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
e5e0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
e5f0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
e600: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
e610: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
e620: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
e630: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
e640: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
e650: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
e660: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
e670: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
e680: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
e690: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
e6a0: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
e6b0: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
e6c0: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
e6d0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
e6e0: 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
e6f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e700: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
e710: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
e720: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
e730: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
e740: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
e750: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
e760: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
e770: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
e780: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
e790: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
e7a0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
e7b0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
e7c0: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
e7d0: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
e7e0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
e7f0: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
e800: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
e810: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
e820: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
e830: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
e840: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
e850: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
e860: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
e870: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
e880: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
e890: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
e8a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
e8b0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
e8c0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
e8d0: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
e8e0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
e8f0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
e900: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
e910: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
e920: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
e930: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
e940: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
e950: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
e960: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
e970: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
e980: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
e990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e9a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e9b0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
e9c0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
e9d0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
e9e0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
e9f0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ea00: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
ea10: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
ea20: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
ea30: 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
ea40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ea50: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
ea60: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
ea70: 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
ea80: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
ea90: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
eaa0: 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
eab0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
eac0: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
ead0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
eae0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
eaf0: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
eb00: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
eb10: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
eb20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
eb30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
eb40: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
eb50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
eb60: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
eb70: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
eb80: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
eb90: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
eba0: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
ebb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ebc0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
ebd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ebe0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
ebf0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
ec00: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
ec10: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
ec20: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ec30: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ec40: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
ec50: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
ec60: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
ec70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
ec80: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
ec90: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
eca0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
ecb0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
ecc0: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
ecd0: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
ece0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
ecf0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
ed00: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
ed10: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
ed20: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
ed30: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
ed40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ed50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ed60: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
ed70: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
ed80: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
ed90: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
eda0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
edb0: 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
edc0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
edd0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
ede0: 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
edf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ee00: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
ee10: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
ee20: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
ee30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
ee40: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
ee50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ee60: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
ee70: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
ee80: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
ee90: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
eea0: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
eeb0: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
eec0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
eed0: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
eee0: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
eef0: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
ef00: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
ef10: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
ef20: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
ef30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
ef40: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
ef50: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
ef60: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
ef70: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
ef80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
ef90: 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
efa0: 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
efb0: 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
efc0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
efd0: 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
efe0: 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
eff0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
f000: 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
f010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
f020: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
f030: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
f040: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
f050: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
f060: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f070: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
f080: 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
f090: 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
f0a0: 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
f0b0: 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
f0c0: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f0d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f0e0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f0f0: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
f100: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
f110: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
f120: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
f130: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
f140: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
f150: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f160: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
f170: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
f180: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f1a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
f1b0: 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
f1c0: 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
f1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f1e0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
f1f0: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
f200: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f210: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
f220: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
f230: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
f240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
f250: 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
f260: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ree = 0;.  }.  i
f270: 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
f280: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f290: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
f2a0: 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
f2b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f2c0: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
f2d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
f2f0: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
f300: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
f310: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
f320: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
f330: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
f340: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
f350: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
f360: 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
f370: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
f380: 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
f390: 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
f3a0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
f3b0: 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
f3c0: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
f3d0: 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
f3e0: 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
f3f0: 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
f400: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f410: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
f420: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
f430: 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
f440: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
f450: 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
f460: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f470: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
f480: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
f490: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
f4a0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f4b0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
f4c0: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
f4d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
f4e0: 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
f4f0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
f500: 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
f510: 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
f520: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
f530: 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
f540: 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
f550: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f560: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f570: 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
f580: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f590: 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
f5a0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f5b0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f5c0: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
f5d0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
f5e0: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
f5f0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
f600: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
f610: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
f620: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
f630: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
f640: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
f650: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
f660: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
f670: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f680: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f690: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
f6a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
f6b0: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
f6c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
f6d0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
f6e0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
f6f0: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
f700: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
f710: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
f720: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
f730: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
f740: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
f750: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
f760: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
f770: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
f780: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
f790: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
f7a0: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
f7b0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
f7c0: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
f7d0: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
f7e0: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
f7f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
f800: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
f810: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
f820: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
f830: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
f840: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
f850: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
f860: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
f870: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
f880: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
f890: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
f8a0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
f8b0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
f8c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f8d0: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
f8e0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
f8f0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
f900: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
f910: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
f920: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
f930: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
f940: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
f950: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f960: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
f970: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
f980: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
f990: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
f9a0: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
f9b0: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
f9c0: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
f9d0: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
f9e0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
f9f0: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
fa00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
fa10: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
fa20: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
fa30: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
fa40: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
fa50: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
fa60: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
fa70: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
fa80: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
fa90: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
faa0: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
fab0: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
fac0: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
fad0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
fae0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
faf0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
fb00: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
fb10: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
fb20: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
fb30: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
fb40: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
fb50: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
fb60: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
fb70: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
fb80: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
fb90: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
fba0: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
fbb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
fbc0: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
fbd0: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
fbe0: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
fbf0: 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
fc00: 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
fc10: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
fc20: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
fc30: 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
fc40: 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
fc50: 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
fc60: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
fc70: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
fc80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
fc90: 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
fca0: 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
fcb0: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
fcc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
fcd0: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
fce0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
fcf0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
fd00: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
fd10: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
fd20: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
fd30: 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
fd40: 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
fd50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fd60: 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
fd70: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
fd80: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
fd90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fda0: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
fdb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fdc0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
fdd0: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
fde0: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
fdf0: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
fe00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
fe10: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
fe20: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
fe30: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
fe40: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
fe50: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
fe60: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
fe70: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
fe80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fe90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
fea0: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
feb0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
fec0: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
fed0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
fee0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
fef0: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
ff00: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
ff10: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
ff20: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
ff30: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
ff40: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
ff50: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
ff60: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
ff70: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
ff80: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
ff90: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
ffa0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
ffb0: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
ffc0: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
ffd0: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
ffe0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
fff0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10000 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
10010 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
10020 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
10030 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
10040 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
10050 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
10060 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
10070 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
10080 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
10090 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
100a0 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
100b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
100c0 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
100d0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
100e0 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
100f0 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
10100 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
10110 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
10120 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
10130 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
10140 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
10150 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
10160 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
10170 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
10180 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10190 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
101a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
101b0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
101c0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
101d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
101e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
101f0 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
10200 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
10210 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10220 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10230 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10240 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10250 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
10260 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
10270 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
10280 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
10290 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
102a0 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
102b0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
102c0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
102d0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
102e0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
102f0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
10300 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
10310 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
10320 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
10330 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
10340 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
10350 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
10360 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
10370 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
10380 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
10390 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
103a0 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
103b0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
103c0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
103d0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
103e0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
103f0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
10400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10410 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
10420 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10430 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
10440 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
10450 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
10460 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10470 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
10480 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10490 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
104a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
104b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
104c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
104d0 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
104e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
104f0 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
10500 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10510 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
10530 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
10540 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
10550 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
10560 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
10570 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
10580 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
10590 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
105a0 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
105b0 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
105c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
105d0 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
105e0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
105f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10600 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10610 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10620 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
10630 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
10640 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10650 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
10660 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
10670 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10680 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
10690 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
106a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
106b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
106c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
106d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
106e0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
106f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10700 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
10710 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
10720 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
10730 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
10740 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
10750 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
10760 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
10770 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10780 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
10790 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
107a0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
107b0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
107c0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
107d0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
107e0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
107f0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
10800 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
10810 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
10820 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
10830 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
10840 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
10850 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
10860 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
10870 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
10880 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
10890 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
108a0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
108b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
108c0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
108d0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
108e0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
108f0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
10900 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
10910 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
10920 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
10930 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
10940 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
10950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
10960 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
10970 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
10980 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
10990 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
109a0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
109b0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
109c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
109d0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
109e0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
109f0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
10a00 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
10a10 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
10a20 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
10a30 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
10a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10a50 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
10a60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
10a70 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
10a80 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
10a90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10aa0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
10ab0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10ac0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10ad0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
10ae0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
10af0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10b00 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
10b10 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
10b20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10b30 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
10b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
10b50 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
10b60 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
10b70 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
10b80 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
10b90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
10ba0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
10bb0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
10bc0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
10bd0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
10be0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
10bf0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10c00 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
10c10 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
10c20 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
10c30 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
10c40 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
10c50 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
10c60 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
10c70 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
10c80 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
10c90 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
10ca0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
10cb0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
10cc0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
10cd0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
10ce0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
10cf0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
10d00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
10d10 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
10d20 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
10d30 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
10d40 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10d50 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
10d60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10d80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10d90 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
10da0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
10db0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
10dc0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
10dd0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
10de0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
10df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10e00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
10e10 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
10e20 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
10e30 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
10e40 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
10e50 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
10e60 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
10e70 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
10e80 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
10e90 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
10ea0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10eb0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
10ec0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
10ed0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
10ee0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
10ef0 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
10f00 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
10f10 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
10f20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10f30 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
10f40 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
10f50 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
10f60 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
10f70 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
10f80 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
10f90 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
10fa0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
10fb0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
10fc0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
10fd0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
10fe0 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
10ff0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
11000 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11010 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
11020 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
11030 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
11040 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11050 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
11060 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
11070 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
11080 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
11090 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
110a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
110b0 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
110c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
110d0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
110e0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
110f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
11100 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
11110 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
11120 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
11130 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
11140 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
11150 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
11160 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
11170 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
11180 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
11190 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
111a0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
111b0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
111c0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
111d0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
111e0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
111f0 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
11200 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
11210 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
11220 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
11230 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
11240 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
11250 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11260 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11280 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
11290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
112a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
112b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
112c0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
112d0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
112e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
112f0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11300 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
11310 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
11320 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
11340 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
11350 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
11360 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
11370 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
11380 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
11390 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
113a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
113b0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
113c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
113d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
113e0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
113f0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
11400 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
11410 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
11420 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11430 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
11440 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
11450 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
11460 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11470 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11480 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
11490 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
114a0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
114b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
114c0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
114d0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
114e0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
114f0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
11500 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
11510 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
11520 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
11530 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
11540 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
11550 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11560 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11570 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
11580 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
11590 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
115a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
115b0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
115c0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
115d0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
115e0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
115f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11600 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
11610 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
11620 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
11630 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
11640 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
11650 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
11660 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
11670 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
11680 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
11690 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
116a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
116b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
116c0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
116d0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
116e0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
116f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
11700 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
11710 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
11720 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
11730 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11740 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
11760 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
11770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
11780 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
11790 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
117a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
117b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
117c0 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
117d0 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
117e0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
117f0 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
11800 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
11810 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
11820 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
11830 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
11840 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
11850 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
11860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11870 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11880 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
11890 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
118a0 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
118b0 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
118c0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
118d0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
118e0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
118f0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
11900 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
11910 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
11920 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
11930 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11940 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
11950 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
11960 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
11970 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
11980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11990 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
119a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
119b0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
119c0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
119d0 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
119e0 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
119f0 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
11a00 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
11a10 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
11a20 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
11a30 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
11a40 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
11a50 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
11a60 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
11a70 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
11a80 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
11a90 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
11aa0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
11ab0 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
11ac0 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
11ad0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11ae0 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
11af0 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
11b00 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
11b10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11b20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11b30 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
11b40 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
11b50 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
11b60 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11b70 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
11b80 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
11b90 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
11ba0 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
11bb0 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
11bc0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
11bd0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
11be0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11bf0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
11c00 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
11c10 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
11c20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
11c30 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
11c40 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
11c50 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
11c60 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
11c70 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
11c80 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
11c90 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
11ca0 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
11cb0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
11cc0 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
11cd0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
11ce0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
11cf0 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
11d00 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
11d10 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
11d20 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
11d30 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
11d40 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
11d50 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
11d60 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
11d70 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
11d80 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
11d90 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
11da0 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
11db0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11dc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
11dd0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
11de0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
11df0 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
11e00 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
11e10 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
11e20 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
11e30 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11e40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11e50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11e60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
11e70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
11eb0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
11ec0 20 72 63 20 29 20 67 6f 74 6f 20 70 61 67 65 31   rc ) goto page1
11ed0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11ef0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
11f00 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
11f10 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
11f20 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
11f30 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
11f40 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
11f50 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
11f60 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11f70 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
11f80 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
11f90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11fa0 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
11fb0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
11fc0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
11fd0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
11fe0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
11ff0 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
12000 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
12010 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
12020 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
12030 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
12040 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
12050 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
12060 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
12070 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
12080 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
12090 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
120a0 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
120b0 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
120c0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
120d0 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
120e0 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
120f0 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
12100 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
12110 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
12120 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
12130 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
12140 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
12150 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
12160 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
12170 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
12180 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
12190 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
121a0 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
121b0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
121c0 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
121d0 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
121e0 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
121f0 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
12200 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
12210 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
12220 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
12230 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
12240 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
12250 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
12260 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
12270 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
12280 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
12290 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
122a0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
122b0 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
122c0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
122d0 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
122e0 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
122f0 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
12300 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
12310 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12320 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
12330 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
12340 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
12350 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
12360 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
12370 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
12380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
12390 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
123a0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
123b0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
123c0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
123d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
123e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
123f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
12400 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
12410 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
12420 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
12430 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
12440 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
12450 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
12460 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
12470 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
12480 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
12490 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
124a0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
124b0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
124c0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
124d0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
124e0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
124f0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
12500 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
12510 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
12520 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
12530 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
12540 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12560 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12570 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12580 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
12590 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  r==0 || pBt->inT
125a0 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
125b0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
125c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
125d0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
125e0 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
125f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12600 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12610 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
12620 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
12630 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
12640 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
12650 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12660 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
12670 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
12680 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
12690 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
126a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
126b0 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
126c0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
126d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
126e0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
126f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
12700 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
12710 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
12720 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
12730 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
12740 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
12750 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72   nPage;..  asser
12760 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12770 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12780 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
12790 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
127a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
127b0 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
127c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  !=SQLITE_OK || n
127d0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
127e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
127f0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
12800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
12810 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
12820 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
12830 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
12840 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
12850 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
12860 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
12870 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
12880 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
12890 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
128a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
128b0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
128c0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
128d0 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61  ata[16], pBt->pa
128e0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
128f0 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
12900 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
12910 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
12920 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
12930 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
12940 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
12950 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
12960 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
12970 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
12980 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
12990 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
129a0 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
129b0 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
129c0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
129d0 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
129e0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
129f0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
12a00 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
12a10 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  A );.  pBt->page
12a20 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
12a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12a40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12a50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
12a60 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
12a70 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
12a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
12a90 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
12aa0 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
12ab0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
12ac0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
12ad0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
12ae0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
12af0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
12b00 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
12b10 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  uum);.#endif.  r
12b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
12b40 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
12b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
12b60 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12b70 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
12b80 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
12b90 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
12ba0 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
12bb0 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
12bc0 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
12bd0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
12be0 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
12bf0 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
12c00 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
12c10 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
12c20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
12c30 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
12c40 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
12c50 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
12c60 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
12c70 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
12c80 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
12c90 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
12ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
12cb0 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
12cc0 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
12cd0 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
12ce0 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
12cf0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
12d00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12d10 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
12d20 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
12d30 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
12d40 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
12d50 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
12d60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
12d70 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
12d80 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
12d90 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
12da0 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
12db0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12dc0 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
12dd0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
12de0 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
12df0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
12e00 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
12e10 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
12e20 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
12e30 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
12e40 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
12e50 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
12e60 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
12e70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12e80 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
12e90 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
12ea0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
12eb0 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
12ec0 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
12ed0 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
12ee0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
12ef0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
12f00 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
12f10 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
12f20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
12f30 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
12f40 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
12f50 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
12f60 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
12f70 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
12f80 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
12f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
12fa0 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
12fb0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
12fc0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
12fd0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
12fe0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
12ff0 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
13000 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
13010 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
13020 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
13030 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
13040 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
13050 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
13060 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
13070 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
13080 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
13090 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
130a0 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
130b0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
130c0 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
130d0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
130e0 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
130f0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
13100 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
13110 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
13120 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
13130 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
13140 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
13150 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
13160 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
13170 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
13180 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13190 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
131a0 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
131b0 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
131c0 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
131d0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
131e0 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
131f0 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
13200 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
13210 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
13220 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13230 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13240 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
13250 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13260 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
13270 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13280 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
13290 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
132a0 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
132b0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
132c0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
132d0 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
132e0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
132f0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
13300 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
13310 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
13320 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
13330 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
13340 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
13350 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
13360 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
13370 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
13380 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
13390 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
133a0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
133b0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
133c0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
133d0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
133e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
133f0 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
13400 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13410 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13420 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13430 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
13440 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
13450 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
13460 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
13470 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
13480 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
13490 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
134a0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
134b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
134c0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
134d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
134e0 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
134f0 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
13500 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13510 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c  =TRANS_WRITE) ||
13520 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
13530 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
13540 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
13550 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
13560 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
13570 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
13580 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
13590 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
135a0 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
135b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
135c0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
135d0 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
135e0 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
135f0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
13600 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13610 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
13620 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
13630 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
13640 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
13650 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
13660 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
13670 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
13680 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13690 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
136a0 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
136b0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
136c0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
136d0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
136e0 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
136f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
13700 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
13710 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
13720 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
13730 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
13740 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
13750 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
13760 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13770 28 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65  (rc = queryShare
13780 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
13790 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
137a0 52 45 41 44 5f 4c 4f 43 4b 29 29 20 29 7b 0a 20  READ_LOCK)) ){. 
137b0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
137c0 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b  gun;.  }..  do {
137d0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
137e0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
137f0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
13800 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
13810 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
13820 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
13830 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
13840 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
13850 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
13860 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
13870 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
13880 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
13890 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
138a0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
138b0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
138c0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
138d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
138e0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
138f0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
13900 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
13910 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
13920 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
13930 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
13940 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
13950 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
13960 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
13970 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
13980 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
13990 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
139a0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
139b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
139c0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
139d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
139e0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
139f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13a00 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
13a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13a20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13a30 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
13a40 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
13a50 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
13a60 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
13a70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13a80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13a90 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
13aa0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
13ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13ac0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
13ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ae0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13af0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
13b00 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
13b10 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
13b20 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13b30 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
13b40 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
13b50 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13b60 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
13b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13b80 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
13b90 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
13ba0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
13bb0 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
13bc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13bd0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13be0 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
13bf0 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28  able ){..assert(
13c00 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
13c10 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
13c20 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
13c30 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
13c40 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
13c50 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
13c60 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
13c70 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
13c80 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
13c90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
13ca0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
13cb0 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
13cc0 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
13cd0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
13ce0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
13cf0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
13d00 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
13d10 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
13d20 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69  nTrans;.    }.#i
13d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d40 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13d50 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
13d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13d70 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
13d80 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
13d90 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
13da0 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
13db0 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b   (u8)(wrflag>1);
13dc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
13dd0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
13de0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13df0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
13e00 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
13e10 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
13e20 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
13e30 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
13e40 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
13e50 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
13e60 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
13e70 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
13e80 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
13e90 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
13ea0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
13eb0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
13ec0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
13ed0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
13ee0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13ef0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
13f00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
13f10 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
13f20 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
13f30 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
13f40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13f60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13f70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13f80 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
13f90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
13fa0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
13fb0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
13fc0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
13fd0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
13fe0 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
13ff0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
14000 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
14010 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
14020 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
14030 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
14040 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14050 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
14060 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
14070 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
140a0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
140b0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
140e0 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
140f0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14120 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
14130 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14140 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
14150 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
14160 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
14170 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
14180 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
14190 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
141a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
141b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
141c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
141d0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
141e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
141f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
14200 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
14210 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
14220 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
14230 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
14240 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
14250 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
14260 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
14270 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ;..    rc = ptrm
14280 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
14290 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
142a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
142b0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
142c0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
142d0 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  s_out;.    }..  
142e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
142f0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
14300 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
14310 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
14320 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
14330 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
14340 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
14350 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
14360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14370 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64  ) goto set_child
14380 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
14390 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
143a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
143b0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
143c0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
143d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
143e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
143f0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
14400 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
14410 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
14420 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65  , pgno);.  }..se
14430 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
14440 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
14450 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
14460 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
14470 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
14480 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69  re on pPage, whi
14490 63 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ch is guaranteed
144a0 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70   to be a btree p
144b0 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72  age, not an over
144c0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73  flow.** page, is
144d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
144e0 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79  ge iFrom. Modify
144f0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
14500 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
14510 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d  to.** iTo. Param
14520 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
14530 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
14540 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d   pointer to be m
14550 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20  odified, as .** 
14560 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
14570 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
14580 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
14590 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
145a0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
145b0 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
145c0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
145d0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
145e0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
145f0 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
14600 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
14610 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
14620 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
14650 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
14660 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
14670 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
14680 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
14690 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
146a0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
146b0 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
146c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
146d0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
146e0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
146f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
14700 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
14710 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
14720 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
14730 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
14740 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
14750 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14760 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
14770 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
14780 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
14790 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
147a0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
147b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
147c0 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
147d0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
147e0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
147f0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
14800 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
14810 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
14820 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
14830 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
14840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14850 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
14860 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
14870 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
14880 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
14890 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
148a0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
148b0 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
148c0 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
148d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
148e0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
148f0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
14900 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
14910 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
14920 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
14930 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
14940 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
14950 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
14960 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
14970 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
14980 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
14990 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
149a0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
149b0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
149c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
149d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
149e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
149f0 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
14a00 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
14a10 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
14a20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
14a30 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
14a40 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
14a50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14a60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14a70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
14a80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
14a90 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
14aa0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
14ab0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
14ac0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
14ad0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14ae0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14af0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
14b00 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
14b10 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
14b20 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
14b30 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
14b40 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
14b50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
14b60 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
14b70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14b90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
14ba0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
14bb0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
14bc0 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
14bd0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
14be0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
14bf0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
14c00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14c10 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
14c20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
14c30 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
14c40 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
14c50 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
14c60 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
14c70 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
14c80 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74  ins valid..*/.st
14c90 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
14ca0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
14cb0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
14cc0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
14cd0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
14ce0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
14cf0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
14d00 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
14d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
14d20 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
14d30 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
14d40 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
14d50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
14d60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
14d70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
14d80 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
14d90 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
14da0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
14db0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
14dc0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
14dd0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a  .  int isCommit.
14de0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
14df0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
14e00 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
14e10 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
14e20 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
14e30 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
14e40 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
14e50 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
14e60 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
14e70 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
14e80 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
14e90 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
14ea0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
14eb0 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
14ec0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
14ed0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
14ee0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
14ef0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14f00 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14f10 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
14f20 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
14f30 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
14f40 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
14f50 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
14f60 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
14f70 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
14f80 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
14f90 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
14fa0 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
14fb0 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
14fc0 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
14fd0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
14fe0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
14ff0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
15000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15010 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
15020 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
15030 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
15040 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
15050 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
15070 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
15080 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
15090 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
150a0 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
150b0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
150c0 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
150d0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
150e0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
150f0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
15100 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
15110 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
15120 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
15130 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
15140 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
15150 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
15160 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
15170 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
15180 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
15190 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
151a0 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
151b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
151c0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
151d0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
151e0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
151f0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
15200 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
15210 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
15220 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
15230 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
15240 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
15250 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
15260 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
15270 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
15280 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
15290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
152b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
152c0 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
152d0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
152e0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
152f0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
15300 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
15310 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
15320 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
15330 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
15340 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
15350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15360 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
15370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15380 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
15390 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
153a0 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
153b0 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
153c0 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
153d0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
153e0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
153f0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
15400 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
15410 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
15420 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
15430 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
15440 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
15450 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
15460 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
15470 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
15480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
154a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
154b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
154c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
154d0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
154e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
154f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15500 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
15510 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
15520 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15530 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
15540 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
15550 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
15560 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
15570 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15580 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
15590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
155a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
155b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
155c0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
155d0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
155e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
155f0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
15600 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
15610 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
15620 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
15630 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
15640 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
15650 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
15660 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
15670 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
15680 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
15690 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
156a0 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
156b0 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
156c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
156d0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
156e0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
156f0 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
15700 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
15710 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
15720 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
15730 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
15740 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
15750 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15760 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
15770 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
15780 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
15790 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
157a0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
157b0 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
157c0 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
157d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
157e0 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
157f0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
15800 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
15810 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
15820 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
15830 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
15840 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
15850 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
15860 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
15870 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
15880 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
15890 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
158a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
158b0 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
158c0 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
158d0 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
158e0 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
158f0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
15900 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
15910 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
15920 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
15930 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
15940 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15950 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
15960 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
15970 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
15980 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15990 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
159a0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
159b0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
159c0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
159d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
159e0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
159f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
15a00 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) ){.    int rc;
15a10 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
15a20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
15a30 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
15a40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
15a50 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
15a60 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
15a70 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
15a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15a90 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
15aa0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
15ab0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
15ac0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
15ad0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
15ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15af0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15b00 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
15b10 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
15b20 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
15b30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15b40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
15b50 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
15b60 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
15b70 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
15b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
15b90 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
15ba0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
15bb0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
15bc0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
15bd0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
15be0 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
15bf0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
15c00 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
15c10 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
15c20 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
15c30 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
15c40 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
15c50 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
15c60 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
15c70 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
15c80 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
15c90 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
15ca0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
15cb0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
15cc0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
15cd0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
15ce0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
15cf0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
15d00 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
15d10 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
15d20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15d40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
15d60 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
15d70 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
15d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
15d90 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
15da0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
15db0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15dd0 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
15de0 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
15df0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
15e00 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
15e10 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
15e20 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
15e30 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
15e40 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
15e50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15e80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
15e90 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
15ea0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
15eb0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
15ec0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
15ed0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
15ee0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
15ef0 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
15f00 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
15f10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
15f20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
15f30 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
15f40 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
15f50 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
15f60 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
15f70 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
15f80 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
15f90 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
15fa0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
15fb0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
15fc0 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
15fd0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
15fe0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
15ff0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
16000 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
16010 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
16020 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
16030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16050 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
16060 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
16070 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16080 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16090 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
160a0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
160b0 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
160c0 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
160d0 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
160e0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
160f0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
16100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16110 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
16120 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
16130 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16150 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
16160 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
16170 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
16180 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
16190 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
161a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
161b0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
161c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
161d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
161e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
161f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
16200 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  Fin==0 ){.    iL
16210 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
16220 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
16230 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
16240 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
16250 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
16260 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
16270 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16280 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
16290 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
162a0 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  g;.        int r
162b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
162c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
162d0 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a  stPg, &pPg, 0);.
162e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
162f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16300 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16330 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
16340 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
16350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16360 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
16370 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16380 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16390 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
163a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c        }.      iL
163b0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20  astPg--;.    }. 
163c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
163d0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
163e0 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50  ->pPager, iLastP
163f0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
16400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16410 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
16420 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
16430 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
16440 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
16450 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
16460 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
16470 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
16480 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
16490 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
164a0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
164b0 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
164c0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
164d0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
164e0 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
164f0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
16500 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
16510 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
16520 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
16530 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16540 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
16550 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16560 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
16570 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
16580 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
16590 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
165a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
165b0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
165c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
165d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
165e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
165f0 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
16600 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
16610 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
16620 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
16630 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16640 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
16650 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
16660 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
16670 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63  t);.    rc = inc
16680 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
16690 20 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75   0, pagerPagecou
166a0 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20  nt(pBt));.  }.  
166b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
166c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
166d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
166e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
166f0 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
16700 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
16710 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
16720 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64  n.** is commited
16730 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
16740 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
16750 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
16760 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
16770 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
16780 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
16790 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
167a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
167b0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
167c0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
167d0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
167e0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
167f0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
16800 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
16810 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
16820 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
16830 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
16840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
16850 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
16860 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
16870 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16880 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
16890 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
168a0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
168b0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
168c0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
168d0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
168e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
168f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16900 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
16910 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
16920 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
16930 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
16940 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
16950 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
16960 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a  .    Pgno nFin;.
16970 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a      Pgno nFree;.
16980 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
16990 3b 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  ;.    Pgno iFree
169a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
169b0 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
169c0 53 69 7a 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  Size;.    Pgno n
169d0 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65  Orig = pagerPage
169e0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20 20  count(pBt);..   
169f0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
16a00 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
16a10 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
16a20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16a30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
16a40 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
16a50 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
16a60 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
16a70 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
16a80 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
16a90 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
16aa0 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
16ab0 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
16ac0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
16ad0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
16ae0 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
16af0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
16b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16b10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16b20 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
16b30 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
16b40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
16b50 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74  ta[36]);.    nPt
16b60 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
16b70 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
16b80 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67  O(pBt, nOrig)+pg
16b90 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a  sz/5)/(pgsz/5);.
16ba0 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
16bb0 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
16bc0 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  ap;.    if( nOri
16bd0 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
16be0 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
16bf0 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
16c00 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
16c10 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
16c20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
16c30 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
16c40 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
16c50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16c60 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
16c70 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
16c80 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
16c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16ca0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  RUPT_BKPT;..    
16cb0 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
16cc0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
16cd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
16ce0 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
16cf0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
16d00 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
16d10 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
16d20 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
16d30 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
16d40 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
16d50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
16d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
16d70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16d80 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
16d90 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
16da0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
16db0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
16dc0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
16dd0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
16de0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
16df0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16e00 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
16e10 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
16e20 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a  r, nFin);.    }.
16e30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16e40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
16e50 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
16e60 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
16e70 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
16e80 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
16e90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
16ea0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
16eb0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
16ec0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
16ed0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
16ee0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
16ef0 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
16f00 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
16f10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16f20 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
16f30 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
16f40 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
16f50 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
16f60 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
16f70 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
16f80 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
16f90 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
16fa0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
16fb0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
16fc0 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
16fd0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
16fe0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
16ff0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
17000 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
17010 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
17020 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
17030 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
17040 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
17050 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
17060 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
17070 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
17080 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
17090 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
170a0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
170b0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
170c0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
170d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
170e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
170f0 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
17100 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
17110 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
17120 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
17130 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
17140 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
17150 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
17160 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
17170 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
17180 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
17190 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
171a0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
171b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
171c0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
171d0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
171e0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
171f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
17200 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
17210 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
17220 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
17230 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
17240 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
17250 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
17260 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
17270 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
17280 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
17290 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
172a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
172b0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
172c0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
172d0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
172e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
172f0 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
17300 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
17310 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
17320 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
17330 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
17340 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
17350 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
17360 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
17370 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
17380 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
17390 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
173a0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
173b0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
173c0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
173d0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
173e0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
173f0 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
17400 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
17410 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
17420 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
17430 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
17440 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
17450 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
17460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17470 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
17480 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
17490 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
174a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
174b0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
174c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
174d0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
174e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
174f0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
17500 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
17510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17520 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
17530 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
17540 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
17550 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
17560 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
17570 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17580 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
17590 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
175a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
175b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
175c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
175d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
175e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
175f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
17600 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
17610 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17620 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
17640 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
17650 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
17660 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
17670 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
17680 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
17690 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
176a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
176b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
176c0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
176d0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
176e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
176f0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
17700 6f 72 20 2a 70 43 73 72 3b 0a 20 20 61 73 73 65  or *pCsr;.  asse
17710 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
17720 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
17730 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
17740 72 20 61 20 63 75 72 73 6f 72 20 68 65 6c 64 20  r a cursor held 
17750 6f 70 65 6e 20 62 79 20 74 68 69 73 20 62 2d 74  open by this b-t
17760 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ree connection. 
17770 49 66 20 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20  If one exists,. 
17780 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 74 72 61   ** then the tra
17790 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
177a0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
177b0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
177c0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74  action.  ** inst
177d0 65 61 64 20 6f 66 20 61 63 74 75 61 6c 6c 79 20  ead of actually 
177e0 63 6f 6e 63 6c 75 64 65 64 2e 20 41 20 73 75 62  concluded. A sub
177f0 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
17800 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
17810 20 0a 20 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61   .  ** or Rollba
17820 63 6b 28 29 20 77 69 6c 6c 20 66 69 6e 69 73 68  ck() will finish
17830 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17840 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
17850 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
17860 66 6f 72 28 70 43 73 72 3d 70 42 74 2d 3e 70 43  for(pCsr=pBt->pC
17870 75 72 73 6f 72 3b 20 70 43 73 72 20 26 26 20 70  ursor; pCsr && p
17880 43 73 72 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20  Csr->pBtree!=p; 
17890 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74  pCsr=pCsr->pNext
178a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
178b0 72 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  r==0 || p->inTra
178c0 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
178d0 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61  ..  btreeClearHa
178e0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
178f0 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20   if( pCsr ){.   
17900 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
17910 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
17920 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
17930 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
17940 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
17950 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
17960 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
17970 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
17980 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
17990 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
179a0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
179b0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
179c0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
179d0 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
179e0 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
179f0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
17a00 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
17a10 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
17a20 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
17a30 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
17a40 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
17a50 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
17a60 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
17a70 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
17a80 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
17a90 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
17aa0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
17ab0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
17ac0 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
17ad0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
17ae0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
17af0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
17b00 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
17b10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
17b20 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
17b30 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
17b40 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
17b50 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
17b60 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
17b70 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
17b80 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
17b90 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17ba0 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
17bb0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
17bc0 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
17bd0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
17be0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
17bf0 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
17c00 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
17c10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
17c20 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
17c30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
17c40 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
17c50 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
17c60 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
17c70 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
17c80 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
17c90 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
17ca0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
17cb0 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
17cc0 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
17cd0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
17ce0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
17cf0 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
17d00 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
17d10 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
17d20 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
17d30 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
17d40 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
17d50 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
17d60 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
17d70 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
17d80 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
17d90 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
17da0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
17db0 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
17dc0 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
17dd0 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
17de0 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
17df0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
17e00 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
17e10 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
17e20 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
17e30 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
17e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
17e50 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
17e60 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
17e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
17e80 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
17e90 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
17ea0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
17eb0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
17ec0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
17ed0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
17ee0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
17ef0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17f00 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
17f10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17f20 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
17f30 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
17f40 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
17f50 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
17f60 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
17f70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
17f80 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
17f90 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
17fa0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
17fb0 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
17fc0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
17fd0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
17fe0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
17ff0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
18000 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18010 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
18020 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
18030 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
18040 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18050 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
18060 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
18070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
18080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18090 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
180a0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
180b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
180c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
180d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
180e0 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
180f0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
18100 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18110 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18130 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
18140 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
18150 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
18160 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
18170 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
18180 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
18190 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
181a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
181b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
181c0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
181d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
181e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
181f0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
18200 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18210 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18230 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
18240 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
18250 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
18260 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
18270 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
18280 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
18290 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
182a0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
182b0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
182c0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
182d0 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
182e0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
182f0 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
18300 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
18310 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
18320 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
18330 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
18340 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
18350 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
18360 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
18370 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
18380 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
18390 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
183a0 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
183b0 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
183c0 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
183d0 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
183e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
183f0 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
18400 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
18410 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
18420 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
18430 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
18440 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
18450 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
18460 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
18470 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
18480 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
18490 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
184a0 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
184b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
184c0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
184d0 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
184e0 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
184f0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
18500 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
18510 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
18520 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
18530 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
18540 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
18550 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
18560 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
18570 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
18580 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
18590 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
185a0 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
185b0 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
185c0 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
185d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
185e0 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
185f0 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
18600 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
18610 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
18620 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
18630 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
18640 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
18650 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
18660 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
18670 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
18680 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
18690 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
186a0 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
186b0 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
186c0 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
186d0 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
186e0 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
186f0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
18700 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
18710 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
18720 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18730 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
18740 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
18750 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
18760 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
18770 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18780 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
18790 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
187a0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
187b0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
187c0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
187d0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
187e0 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
187f0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
18800 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20  LT;.    p->skip 
18810 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
18820 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
18830 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
18840 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
18850 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
18860 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
18870 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
18880 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18890 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
188a0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
188b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
188c0 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
188d0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
188e0 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
188f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
18900 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
18910 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
18920 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
18930 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18940 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
18950 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
18960 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
18970 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
18980 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
18990 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
189a0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
189b0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
189c0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
189d0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
189e0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
189f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18a00 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
18a10 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
18a20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18a30 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
18a40 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
18a50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18a60 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  p);.  rc = saveA
18a70 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
18a80 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
18a90 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
18aa0 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
18ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18ac0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
18ad0 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
18ae0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
18af0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
18b00 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
18b10 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
18b20 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
18b30 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
18b40 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
18b50 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
18b60 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
18b70 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
18b80 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
18b90 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
18ba0 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
18bb0 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
18bc0 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
18bd0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
18be0 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
18bf0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
18c00 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
18c10 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
18c20 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
18c30 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
18c40 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
18c50 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
18c60 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
18c70 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
18c80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
18c90 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
18ca0 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20  ursors(p, rc);. 
18cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
18cc0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
18cd0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
18ce0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
18cf0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
18d00 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
18d10 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
18d20 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
18d30 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
18d40 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
18d50 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
18d60 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
18d70 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18d80 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
18d90 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
18da0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
18db0 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
18dc0 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
18dd0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69      ** call sqli
18de0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
18df0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
18e00 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
18e10 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
18e20 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
18e30 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
18e40 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18e50 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
18e60 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
18e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
18e80 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
18e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18ea0 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
18eb0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
18ec0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
18ed0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
18ee0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  READ;.  }..  btr
18ef0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
18f00 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
18f10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18f20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18f30 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
18f40 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
18f50 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
18f60 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
18f70 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
18f80 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
18f90 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
18fa0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
18fb0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
18fc0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
18fd0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
18fe0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
18ff0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
19000 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
19010 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
19020 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
19030 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
19040 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
19050 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
19060 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
19070 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
19080 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
19090 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
190a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
190b0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
190c0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
190d0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
190e0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
190f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
19100 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
19110 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
19120 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
19130 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
19140 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
19150 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
19160 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
19170 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
19180 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
19190 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
191a0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
191b0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
191c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
191d0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
191e0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
191f0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
19200 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
19210 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
19220 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
19230 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
19240 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
19250 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
19260 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
19270 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
19280 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
19290 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
192a0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
192b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
192c0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
192d0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
192e0 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
192f0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
19300 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
19310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19320 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
19330 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
19340 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
19350 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
19360 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
19370 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19380 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
19390 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
193a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
193b0 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  rt( pBt->readOnl
193c0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
193d0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
193e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
193f0 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
19400 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66  avepoint );.  if
19410 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61  ( NEVER(p->inTra
19420 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
19430 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  || pBt->readOnly
19440 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
19450 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20  LITE_INTERNAL;. 
19460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
19470 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
19480 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
19490 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74  ITE );.    /* At
194a0 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
194b0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
194c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
194d0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
194e0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
194f0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
19500 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
19510 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
19520 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74  ng.    ** SQL st
19530 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
19540 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
19550 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
19560 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20  back any.    ** 
19570 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
19580 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
19590 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
195a0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
195b0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
195c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
195d0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
195e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
195f0 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  tement);.  }.  s
19600 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19610 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
19620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
19630 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
19640 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
19650 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
19660 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19670 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
19680 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
19690 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
196a0 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
196b0 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
196c0 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
196d0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
196e0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
196f0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
19700 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
19710 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
19720 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
19730 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
19740 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
19750 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
19760 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
19770 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
19780 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
19790 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
197a0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
197b0 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
197c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
197d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
197e0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
197f0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
19800 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
19810 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
19820 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
19830 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
19840 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
19850 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
19860 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
19870 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
19880 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
19890 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
198a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
198b0 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
198c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
198d0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
198e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
198f0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
19900 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
19910 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
19920 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
19930 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
19940 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
19950 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
19960 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19970 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
19980 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
199a0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
199b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
199c0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
199d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
199e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
199f0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
19a00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
19a10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19a20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
19a40 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
19a50 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
19a60 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
19a70 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
19a80 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
19a90 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
19aa0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
19ab0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
19ac0 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
19ad0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
19ae0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
19af0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
19b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
19b10 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
19b20 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
19b30 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
19b40 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
19b50 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
19b60 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
19b70 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
19b80 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
19b90 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
19ba0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
19bb0 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
19bc0 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
19bd0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
19be0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
19bf0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
19c00 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
19c10 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
19c20 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
19c30 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
19c40 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
19c50 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
19c60 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
19c70 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
19c80 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
19c90 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
19ca0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
19cb0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
19cc0 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
19cd0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
19ce0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
19cf0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
19d00 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
19d10 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
19d20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
19d30 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
19d40 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
19d50 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
19d60 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
19d70 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
19d80 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
19d90 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
19da0 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
19db0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
19dc0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
19dd0 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
19de0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
19df0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
19e00 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
19e10 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
19e20 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
19e30 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
19e40 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
19e50 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
19e60 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
19e70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
19e80 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
19e90 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
19ea0 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
19eb0 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
19ec0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
19ed0 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
19ee0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
19ef0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
19f00 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
19f10 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
19f20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
19f30 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
19f40 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
19f50 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
19f60 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20   .** pointed to 
19f70 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65  by pCur have bee
19f80 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20  n zeroed by the 
19f90 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19fa0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
19fb0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19fe0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
19ff0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1a020 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1a030 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1a040 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a060 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1a070 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1a080 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1a090 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1a0a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1a0b0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1a0c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1a0d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1a100 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1a110 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1a120 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a140 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1a150 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1a160 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1a170 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1a180 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1a190 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1a1a0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1a1b0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1a1c0 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1a1d0 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1a1e0 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1a1f0 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1a200 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1a210 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1a220 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1a230 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1a240 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1a250 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1a260 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1a270 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1a280 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1a290 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1a2a0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1a2b0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1a2c0 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1a2d0 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1a2e0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1a2f0 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1a300 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1a310 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1a320 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1a330 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1a340 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1a350 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1a360 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1a370 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1a380 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1a390 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1a3a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1a3b0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1a3c0 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1a3d0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1a3e0 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1a3f0 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e  g && pBt->readOn
1a400 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ly) ){.    retur
1a410 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1a420 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  Y;.  }.  if( iTa
1a430 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50  ble==1 && pagerP
1a440 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1a450 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a460 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
1a470 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1a480 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1a490 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1a4a0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1a4b0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1a4c0 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1a4d0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1a4e0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1a4f0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1a500 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1a510 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1a520 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1a530 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1a540 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1a550 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1a560 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1a570 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
1a580 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
1a590 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1a5a0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1a5b0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1a5c0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1a5d0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1a5e0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1a5f0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1a600 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a610 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
1a620 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1a630 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1a640 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1a650 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1a660 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1a6a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1a6e0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1a6f0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a720 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1a730 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1a740 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1a750 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1a760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a770 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1a780 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1a790 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1a7c0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1a7d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1a7e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a7f0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1a800 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1a810 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1a820 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1a830 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a840 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a860 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1a870 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1a880 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1a890 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1a8a0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1a8b0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1a8c0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1a8d0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1a8e0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1a8f0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1a900 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1a910 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1a920 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1a930 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1a940 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1a950 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1a960 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1a970 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1a980 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1a990 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1a9a0 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  n sizeof(BtCurso
1a9b0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
1a9c0 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1a9d0 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  d value of every
1a9e0 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73   cursor in the s
1a9f0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
1aa00 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64  e.** as pCur and
1aa10 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65   having the same
1aa20 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
1aa30 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20  r as pCur.  The 
1aa40 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20  value is.** set 
1aa50 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a  to iRowid..**.**
1aa60 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72   Only positive r
1aa70 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20  owid values are 
1aa80 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64  considered valid
1aa90 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e   for this cache.
1aaa0 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73  .** The cache is
1aab0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1aac0 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67  zero, indicating
1aad0 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68   an invalid cach
1aae0 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69  e..** A btree wi
1aaf0 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74  ll work fine wit
1ab00 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  h zero or negati
1ab10 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a  ve rowids.  We j
1ab20 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61  ust cannot.** ca
1ab30 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  che zero or nega
1ab40 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69  tive rowids, whi
1ab50 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20  ch means tables 
1ab60 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72  that use zero or
1ab70 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77  .** negative row
1ab80 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ids might run a 
1ab90 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
1aba0 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c  But in practice,
1abb0 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61   zero.** or nega
1abc0 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20  tive rowids are 
1abd0 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f  very uncommon so
1abe0 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
1abf0 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
1ac00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1ac10 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69  reeSetCachedRowi
1ac20 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1ac30 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1ac40 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72  iRowid){.  BtCur
1ac50 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1ac60 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73  pCur->pBt->pCurs
1ac70 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1ac80 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  t){.    if( p->p
1ac90 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70  gnoRoot==pCur->p
1aca0 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63  gnoRoot ) p->cac
1acb0 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  hedRowid = iRowi
1acc0 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
1acd0 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1ace0 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a  id==iRowid );.}.
1acf0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ad00 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66  e cached rowid f
1ad10 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
1ad20 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65  sor.  A negative
1ad30 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75   or zero.** retu
1ad40 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
1ad50 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  es that the rowi
1ad60 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c  d cache is inval
1ad70 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
1ad80 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  .** ignored.  If
1ad90 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1ada0 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
1adb0 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e  e been set, then
1adc0 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65   a.** zero is re
1add0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  turned..*/.sqlit
1ade0 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1adf0 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f  BtreeGetCachedRo
1ae00 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
1ae10 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
1ae20 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b  ur->cachedRowid;
1ae30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1ae40 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
1ae50 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1ae60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1ae70 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
1ae80 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
1ae90 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
1aea0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1aeb0 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
1aec0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
1aed0 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
1aee0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
1aef0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1af00 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
1af10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1af20 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1af30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1af40 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
1af50 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1af60 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  r(pCur);.    if(
1af70 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
1af80 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
1af90 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
1afa0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
1afb0 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
1afc0 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
1afd0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
1afe0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1aff0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
1b000 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1b010 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
1b020 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1b030 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1b040 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1b050 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1b060 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
1b070 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1b080 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69  used(pBt);.    i
1b090 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
1b0a0 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
1b0b0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
1b0c0 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
1b0d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b0e0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1b0f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b100 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1b110 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d  ITE_TEST./*.** M
1b120 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
1b130 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
1b140 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
1b150 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
1b160 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
1b170 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
1b180 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
1b190 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
1b1a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1b1b0 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
1b1c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b1d0 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
1b1e0 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
1b1f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b200 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b210 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  ;.  memcpy(pTemp
1b220 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
1b230 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20  f(BtCursor));.  
1b240 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
1b250 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
1b260 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f  >pPrev = 0;.  fo
1b270 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43  r(i=0; i<=pTempC
1b280 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1b290 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1b2a0 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61  rRef(pTempCur->a
1b2b0 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
1b2c0 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
1b2d0 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79  ( pTempCur->pKey
1b2e0 3d 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ==0 );.}.#endif 
1b2f0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
1b300 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
1b310 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  _TEST./*.** Dele
1b320 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
1b330 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
1b340 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
1b350 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
1b360 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
1b370 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
1b380 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
1b390 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
1b3a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1b3b0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1b3c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b3d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
1b3e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
1b3f0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1b400 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1b410 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
1b420 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
1b430 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1b440 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d  e(pCur->pKey);.}
1b450 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b460 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  E_TEST */../*.**
1b470 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1b480 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1b490 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1b4a0 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1b4b0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1b4c0 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1b4d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1b4e0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69  id, call.** sqli
1b4f0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1b500 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1b510 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1b520 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1b530 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1b540 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1b550 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1b560 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1b570 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1b580 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
1b590 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1b5a0 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1b5b0 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1b5c0 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1b5d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1b5e0 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1b5f0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1b600 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1b610 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1b620 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1b630 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1b640 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1b650 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1b660 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1b670 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1b680 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1b690 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1b6a0 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1b6b0 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1b6c0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1b6d0 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1b6e0 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1b6f0 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1b700 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1b710 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1b720 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1b730 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1b740 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1b750 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1b760 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1b770 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1b780 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1b790 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1b7a0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1b7b0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1b7c0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1b7d0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
1b7e0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1b7f0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1b800 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1b810 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1b820 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1b830 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
1b840 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
1b850 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
1b860 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
1b870 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
1b880 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
1b890 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
1b8a0 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
1b8b0 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
1b8c0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
1b8d0 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
1b8e0 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
1b8f0 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
1b900 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b910 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1b920 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1b930 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
1b940 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1b950 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b960 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1b970 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1b980 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1b990 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1b9a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1b9b0 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1b9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1b9d0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1b9e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
1b9f0 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
1ba00 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
1ba10 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
1ba20 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
1ba30 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
1ba40 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
1ba50 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
1ba60 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
1bab0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1bac0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
1bb00 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1bb10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
1bb50 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1bb60 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1bb70 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1bb80 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1bb90 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1bba0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1bbf0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1bc40 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1bc50 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1bc90 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1bca0 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
1bcb0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1bcc0 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1bcd0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1bce0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1bcf0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1bd00 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1bd10 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1bd20 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1bd30 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1bd40 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1bd50 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1bd60 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1bd70 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1bd80 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1bd90 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1bda0 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1bdb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1bdc0 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1bdd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1bde0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1bdf0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1be00 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1be10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1be20 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1be30 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1be40 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1be50 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1be60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1be70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1be80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1be90 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
1bea0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1beb0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1bec0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1bed0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bee0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
1bef0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1bf00 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1bf10 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1bf20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1bf30 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
1bf40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1bf50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1bf60 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1bf70 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1bf80 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1bf90 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1bfa0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1bfb0 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
1bfc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1bfd0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1bfe0 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
1bff0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1c000 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
1c010 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
1c020 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
1c030 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
1c040 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
1c050 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
1c060 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
1c070 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
1c080 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1c090 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1c0a0 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1c0b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1c0c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c0d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c0e0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1c0f0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1c100 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1c110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1c120 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1c130 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1c140 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1c150 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1c160 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
1c170 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c180 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1c190 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
1c1a0 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
1c1b0 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
1c1c0 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
1c1d0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
1c1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
1c1f0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1c200 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
1c210 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
1c220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c240 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1c250 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1c260 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1c270 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1c280 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1c290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1c2a0 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1c2b0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1c2c0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1c2d0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1c2e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1c2f0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1c300 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1c310 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1c320 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1c330 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1c340 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1c350 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1c360 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1c370 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1c380 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1c390 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1c3a0 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1c3b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1c3c0 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1c3d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1c3e0 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1c3f0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1c400 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1c410 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1c420 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1c430 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1c440 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1c450 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1c460 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1c470 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1c480 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1c490 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1c4a0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1c4b0 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1c4c0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1c4d0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1c4e0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1c4f0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1c500 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1c510 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1c520 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1c530 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1c540 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1c550 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1c560 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1c570 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1c580 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1c590 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1c5a0 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1c5b0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1c5c0 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1c5d0 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1c5e0 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1c5f0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1c600 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1c610 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1c620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1c640 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1c670 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1c680 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1c690 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1c6a0 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1c6b0 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1c6c0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1c6d0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1c6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1c6f0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1c700 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1c710 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1c720 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1c730 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1c740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1c750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c760 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1c770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1c780 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1c790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c7a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c7b0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1c7c0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1c7d0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1c7e0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1c7f0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1c800 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1c810 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1c820 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1c830 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1c840 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1c850 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1c860 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1c870 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1c880 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1c890 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1c8a0 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1c8b0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1c8c0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1c8d0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1c8e0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1c8f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1c900 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1c910 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1c920 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1c930 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1c940 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1c950 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1c960 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1c970 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1c980 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1c990 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1c9a0 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65  if( iGuess<=page
1c9b0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
1c9c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1c9d0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1c9e0 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1c9f0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1ca00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ca10 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1ca20 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1ca30 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1ca40 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1ca50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ca60 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1ca70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1ca80 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
1ca90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1caa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1cab0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1cac0 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
1cad0 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51     assert(rc==SQ
1cae0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1caf0 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ==0);.    if( ne
1cb00 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  xt==0 && rc==SQL
1cb10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cb20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
1cb30 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1cb40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
1cb50 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
1cb60 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
1cb70 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
1cb80 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
1cb90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1cba0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1cbb0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
1cbc0 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
1cbd0 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
1cbe0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
1cbf0 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
1cc00 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
1cc10 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
1cc20 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
1cc30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1cc40 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
1cc50 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1cc60 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
1cc70 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
1cc80 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
1cc90 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1cca0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
1ccb0 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
1ccc0 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
1ccd0 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
1cce0 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
1ccf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cd00 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1cd10 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
1cd20 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
1cd30 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
1cd40 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1cd50 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
1cd60 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1cd70 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1cd80 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
1cd90 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
1cda0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1cdb0 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
1cdc0 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
1cdd0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1cde0 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
1cdf0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
1ce20 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
1ce30 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1ce40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ce50 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
1ce60 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce80 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
1ce90 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
1cea0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
1ceb0 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
1cec0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
1ced0 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
1cee0 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
1cef0 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
1cf00 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
1cf10 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
1cf20 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
1cf30 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
1cf40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1cf50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1cf60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cf70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cf80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
1cf90 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
1cfa0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
1cfb0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
1cfc0 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
1cfd0 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
1cfe0 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
1cff0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
1d000 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
1d010 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1d020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d030 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d040 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
1d050 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
1d060 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1d070 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
1d080 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
1d090 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1d0a0 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
1d0b0 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
1d0c0 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
1d0d0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1d0e0 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
1d0f0 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
1d100 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
1d110 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
1d120 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
1d130 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1d140 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
1d150 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
1d160 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
1d170 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
1d180 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
1d190 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
1d1a0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
1d1b0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
1d1c0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
1d1d0 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
1d1e0 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
1d1f0 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
1d200 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
1d210 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
1d220 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
1d230 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
1d240 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
1d250 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
1d260 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1d270 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1d280 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
1d290 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
1d2a0 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
1d2b0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1d2c0 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
1d2d0 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
1d2e0 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
1d2f0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
1d300 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
1d310 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
1d320 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
1d330 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
1d340 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1d350 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
1d360 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
1d370 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
1d380 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
1d390 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
1d3a0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
1d3b0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
1d3c0 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
1d3d0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
1d3e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1d3f0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1d400 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1d410 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
1d420 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
1d430 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
1d440 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
1d450 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
1d460 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
1d470 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
1d480 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
1d490 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
1d4a0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
1d4b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
1d4c0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
1d4d0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
1d4e0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
1d4f0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
1d500 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
1d510 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
1d520 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
1d530 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
1d540 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
1d550 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
1d560 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
1d570 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
1d580 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
1d590 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1d5a0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1d5b0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1d5c0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1d5d0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
1d5e0 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
1d5f0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
1d600 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
1d610 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
1d620 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
1d630 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
1d640 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
1d650 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d660 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
1d670 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
1d680 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
1d690 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
1d6a0 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
1d6b0 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
1d6c0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
1d6d0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1d6e0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1d6f0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1d700 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1d710 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1d720 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1d730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d740 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1d750 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1d760 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1d770 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1d780 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1d790 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1d7a0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1d7b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d7c0 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d7e0 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1d7f0 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1d800 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d820 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d830 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1d840 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1d850 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1d860 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1d870 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d880 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d890 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1d8a0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1d8b0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1d8c0 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1d8d0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1d8e0 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1d8f0 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1d900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
1d910 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  ;..  if( skipKey
1d920 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
1d930 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
1d940 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
1d950 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1d960 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61  Data .   || &aPa
1d970 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1d980 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
1d990 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
1d9a0 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
1d9b0 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
1d9c0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
1d9d0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1d9e0 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
1d9f0 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
1da00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1da10 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1da20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
1da30 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
1da40 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
1da50 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
1da60 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
1da70 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
1da80 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
1da90 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
1daa0 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
1dab0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1dac0 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
1dad0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
1dae0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
1daf0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1db00 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
1db10 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1db20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1db30 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
1db40 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
1db50 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1db60 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
1db70 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
1db80 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
1db90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dba0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1dbb0 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
1dbc0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1dbd0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
1dbe0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
1dbf0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
1dc00 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
1dc10 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
1dc20 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
1dc30 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1dc40 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
1dc50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1dc60 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
1dc70 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
1dc80 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1dc90 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
1dca0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
1dcb0 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
1dcc0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
1dcd0 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
1dce0 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
1dcf0 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
1dd00 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
1dd10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dd20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
1dd30 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
1dd40 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1dd50 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1dd60 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
1dd70 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
1dd80 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
1dd90 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
1dda0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
1ddb0 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
1ddc0 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
1ddd0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
1dde0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
1ddf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1de00 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
1de10 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
1de20 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1de30 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
1de40 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
1de50 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
1de60 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
1de70 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
1de80 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1de90 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
1dea0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
1deb0 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
1dec0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  l);.      if( nO
1ded0 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  vfl && !pCur->aO
1dee0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1def0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1df00 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
1df10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1df20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1df30 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1df40 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
1df50 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
1df60 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1df70 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
1df80 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
1df90 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
1dfa0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
1dfb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1dfc0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1dfd0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1dfe0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
1dff0 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
1e000 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
1e010 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
1e020 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1e030 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
1e040 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
1e050 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
1e060 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e070 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
1e080 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
1e090 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
1e0a0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
1e0b0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1e0c0 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
1e0d0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
1e0e0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1e0f0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
1e100 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
1e110 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1e120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1e130 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1e140 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
1e150 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
1e160 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1e170 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1e180 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
1e190 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
1e1a0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1e1b0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1e1c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e1d0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1e1e0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1e1f0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1e200 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1e210 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1e220 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e230 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1e240 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1e250 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1e260 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1e270 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1e280 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1e290 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1e2a0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1e2b0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1e2c0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1e2d0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1e2e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1e2f0 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1e300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1e310 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1e320 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1e330 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1e340 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1e350 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1e360 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1e370 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1e380 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
1e390 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1e3a0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
1e3b0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
1e3c0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
1e3d0 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
1e3e0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
1e3f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e400 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
1e410 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
1e420 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
1e430 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
1e440 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
1e450 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
1e460 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
1e470 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
1e480 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
1e490 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
1e4a0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
1e4b0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
1e4c0 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
1e4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1e4e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
1e4f0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
1e500 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1e510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e520 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
1e530 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
1e540 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1e550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
1e560 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1e570 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
1e580 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
1e590 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
1e5a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1e5b0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
1e5c0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
1e5d0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1e5e0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1e5f0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
1e600 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1e610 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e620 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e630 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1e640 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
1e650 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e660 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
1e670 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1e680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e690 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e6a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e6b0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1e6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e6d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1e6e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e6f0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1e700 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
1e710 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1e720 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1e730 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1e740 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1e750 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1e760 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1e770 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1e780 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1e790 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e7a0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1e7b0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1e7c0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1e7d0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1e7e0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1e7f0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1e800 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1e810 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1e820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e830 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
1e840 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1e850 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1e860 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1e870 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e880 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e890 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1e8a0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1e8b0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1e8c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e8d0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1e8e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e8f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1e900 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e910 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1e920 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e930 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66  iPage] );.    if
1e940 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
1e950 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
1e960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e970 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e980 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1e990 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e9a0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1e9b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e9c0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1e9d0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
1e9e0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
1e9f0 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
1ea00 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
1ea10 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1ea20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1ea30 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1ea40 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1ea50 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1ea60 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1ea70 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1ea80 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1ea90 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1eaa0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1eab0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1eac0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1ead0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1eae0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1eaf0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1eb00 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1eb10 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1eb20 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1eb30 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1eb40 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1eb50 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1eb60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1eb70 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
1eb80 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1eb90 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1eba0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1ebb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ebc0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1ebd0 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
1ebe0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1ebf0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1ec00 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
1ec10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1ec20 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ec30 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1ec40 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1ec50 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1ec60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ec70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1ec80 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1ec90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1eca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ecb0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1ecc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ecd0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1ece0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ecf0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ed00 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1ed10 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1ed20 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1ed30 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1ed40 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1ed50 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
1ed60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ed70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1ed80 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
1ed90 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
1eda0 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
1edb0 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
1edc0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1edd0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
1ede0 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
1edf0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
1ee00 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
1ee10 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
1ee20 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
1ee30 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
1ee40 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
1ee50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1ee60 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
1ee70 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
1ee80 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
1ee90 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
1eea0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1eeb0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
1eec0 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
1eed0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
1eee0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1eef0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1ef00 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
1ef10 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
1ef20 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
1ef30 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
1ef40 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
1ef50 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
1ef60 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
1ef70 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
1ef80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1ef90 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
1efa0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
1efb0 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
1efc0 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
1efd0 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
1efe0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
1eff0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
1f000 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
1f010 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
1f020 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
1f030 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
1f040 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
1f050 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
1f060 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
1f070 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1f080 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
1f090 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
1f0a0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1f0b0 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
1f0c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f0d0 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
1f0e0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
1f0f0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
1f100 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
1f110 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1f120 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1f130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
1f140 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
1f150 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1f160 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1f170 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1f180 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1f190 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
1f1a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1f1b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1f1c0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
1f1d0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
1f1e0 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
1f1f0 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
1f200 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1f210 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
1f220 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1f230 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
1f240 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
1f250 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
1f260 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
1f270 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
1f280 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1f290 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f2a0 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
1f2b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f2c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f2d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f2e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f2f0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1f300 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f310 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1f320 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f330 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1f340 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
1f350 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1f360 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1f370 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
1f380 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
1f390 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1f3a0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1f3b0 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
1f3c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1f3d0 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70     nKey = (int)p
1f3e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1f3f0 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
1f400 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
1f410 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
1f420 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1f430 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
1f440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1f450 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1f460 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
1f470 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
1f480 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
1f490 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
1f4a0 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
1f4b0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
1f4c0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
1f4d0 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
1f4e0 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
1f4f0 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
1f500 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
1f510 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
1f520 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
1f530 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
1f540 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
1f550 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
1f560 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1f570 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
1f580 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
1f590 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1f5a0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
1f5b0 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
1f5c0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
1f5d0 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
1f5e0 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
1f5f0 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
1f600 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
1f610 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
1f620 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
1f630 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
1f640 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
1f650 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
1f660 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
1f670 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
1f680 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1f690 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1f6a0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
1f6b0 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
1f6c0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
1f6d0 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
1f6e0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
1f6f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1f700 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
1f710 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1f720 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
1f730 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1f740 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1f750 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f760 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1f770 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1f780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1f790 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f7a0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1f7b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f7c0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1f7d0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1f7e0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1f7f0 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1f800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f810 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1f820 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1f830 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1f840 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1f850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f860 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f870 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f880 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f890 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f8a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1f8b0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1f8c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1f8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1f8e0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1f8f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1f900 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
1f910 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
1f920 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1f930 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
1f940 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
1f950 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
1f960 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
1f970 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
1f980 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
1f990 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
1f9a0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
1f9b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f9c0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
1f9d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
1f9e0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
1f9f0 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
1fa00 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1fa10 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
1fa20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fa30 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fa40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1fa50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1fa60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1fa70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1fa80 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
1fa90 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
1faa0 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
1fab0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
1fac0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1fad0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1fae0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
1faf0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1fb00 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
1fb10 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
1fb20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1fb30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
1fb40 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
1fb50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
1fb60 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
1fb70 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
1fb80 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1fb90 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1fba0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
1fbb0 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
1fbc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1fbd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1fbe0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1fbf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1fc00 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1fc10 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
1fc20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
1fc30 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
1fc40 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1fc50 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
1fc60 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1fc70 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
1fc80 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
1fc90 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
1fca0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
1fcb0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
1fcc0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
1fcd0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
1fce0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
1fcf0 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
1fd00 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1fd10 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
1fd20 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
1fd30 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1fd40 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
1fd50 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
1fd60 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
1fd70 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
1fd80 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
1fd90 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
1fda0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
1fdb0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
1fdc0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
1fdd0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
1fde0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
1fdf0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
1fe00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1fe10 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
1fe20 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
1fe30 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
1fe40 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
1fe50 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
1fe60 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
1fe70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1fe80 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1fe90 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1fea0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1feb0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1fec0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1fed0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1fee0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1fef0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1ff00 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1ff10 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1ff20 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1ff30 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1ff40 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1ff50 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1ff60 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1ff70 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1ff80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ff90 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1ffa0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1ffb0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
1ffc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ffd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1ffe0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fff0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20000 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20010 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
20020 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
20030 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
20040 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
20050 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
20060 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20070 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
20080 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20090 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
200a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
200b0 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
200c0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
200d0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
200e0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
200f0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
20100 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
20110 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
20120 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
20130 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
20140 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
20150 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
20160 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
20170 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
20180 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
20190 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
201a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
201b0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
201c0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
201d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
201e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
201f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
20210 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
20220 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
20230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
20240 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
20250 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20260 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
20270 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
20280 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
20290 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
202a0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
202b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
202c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
202d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
202e0 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
202f0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
20300 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20310 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
20320 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
20330 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
20340 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
20350 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
20360 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
20370 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
20380 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
20390 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
203a0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
203b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
203c0 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  f( .      SQLITE
203d0 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e  _OK!=(rc = getAn
203e0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
203f0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
20400 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
20410 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
20420 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
20430 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
20440 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20450 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
20460 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Page = 0;..    /
20470 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
20480 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
20490 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
204a0 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
204b0 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20  s cursor.    ** 
204c0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
204d0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
204e0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
204f0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
20500 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74  s.    ** NULL, t
20510 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
20520 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
20530 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
20540 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a   the case,.    *
20550 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
20560 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
20570 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
20580 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
20590 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  ]->intKey==1 || 
205a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
205b0 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
205c0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65    if( (pCur->pKe
205d0 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d  yInfo==0)!=pCur-
205e0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
205f0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
20600 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20610 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
20620 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  }..  pRoot = pCu
20630 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
20640 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
20650 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
20660 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 61  oot );.  pCur->a
20670 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
20680 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20690 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
206a0 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
206b0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
206c0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
206d0 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
206e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
206f0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
20700 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
20710 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
20720 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
20740 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  ot->pgno==1 );. 
20750 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
20760 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
20770 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
20780 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
20790 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20  sert( subpage>0 
207a0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
207b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
207c0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
207d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
207e0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
207f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
20800 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
20810 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
20820 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
20830 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
20840 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
20850 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
20860 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
20870 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
20880 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
20890 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
208a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
208b0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
208c0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
208d0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
208e0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
208f0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
20900 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
20910 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
20920 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
20930 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
20940 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
20950 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20960 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
20970 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
20980 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20990 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
209a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
209b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
209c0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
209d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
209e0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
209f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20a00 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
20a10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20a20 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20a30 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
20a40 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
20a50 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
20a60 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
20a70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
20a80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
20a90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
20aa0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
20ab0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
20ac0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
20ad0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
20ae0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
20af0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
20b00 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
20b10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
20b20 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
20b30 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
20b40 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
20b50 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
20b60 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
20b70 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
20b80 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
20b90 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
20ba0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
20bb0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
20bc0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
20bd0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
20be0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
20bf0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
20c00 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
20c10 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
20c20 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
20c30 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
20c40 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
20c50 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
20c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
20c70 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
20c80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
20c90 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
20ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20cb0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
20cc0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
20cd0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20ce0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20cf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20d00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20d10 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
20d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d30 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
20d40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20d50 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
20d60 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
20d70 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
20d80 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
20d90 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
20da0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20db0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
20dc0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
20dd0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
20de0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
20df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20e00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20e10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
20e20 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
20e30 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
20e40 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
20e50 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
20e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20e70 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
20e80 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
20e90 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
20ea0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
20eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
20ec0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
20ed0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
20ee0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
20ef0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
20f00 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
20f10 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
20f20 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
20f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20f40 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
20f50 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
20f60 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
20f70 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
20f80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20f90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
20fa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
20fb0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
20fc0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
20fd0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
20fe0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
20ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21000 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
21010 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
21020 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
21030 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21040 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21050 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
21060 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
21070 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21080 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
21090 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
210a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
210b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
210c0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
210d0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
210e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
210f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
21100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21110 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21120 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
21130 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
21140 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
21150 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
21160 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
21170 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
21180 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
21190 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
211a0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
211b0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
211c0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
211d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
211e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
211f0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
21200 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
21210 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21220 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21230 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21240 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
21250 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
21260 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
21270 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
21280 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
21290 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
212a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
212b0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
212c0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
212d0 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74   && pCur->atLast
212e0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
212f0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
21300 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
21310 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
21320 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
21330 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
21340 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
21350 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21360 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
21370 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
21380 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
21390 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
213a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
213b0 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
213c0 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
213d0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
213e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
213f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21400 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
21410 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
21420 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
21430 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21440 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
21450 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
21460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21470 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
21480 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
21490 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
214a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
214b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
214c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
214d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
214e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
214f0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
21500 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
21510 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
21520 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21530 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21540 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21550 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
21560 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
21570 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
21580 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c  .      pCur->atL
21590 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  ast = rc==SQLITE
215a0 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  _OK ?1:0;.    }.
215b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
215c0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
215d0 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
215e0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
215f0 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
21600 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
21610 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
21620 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
21630 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
21640 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
21650 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
21660 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
21670 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
21680 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
21690 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
216a0 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
216b0 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
216c0 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
216d0 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
216e0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
216f0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
21700 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
21710 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
21720 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
21730 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
21740 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
21750 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
21760 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
21770 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
21780 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
21790 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
217a0 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
217b0 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
217c0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
217d0 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
217e0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
217f0 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
21800 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
21810 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
21820 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
21830 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
21840 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
21850 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
21860 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
21870 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
21880 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
21890 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
218a0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
218b0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
218c0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
218d0 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
218e0 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
218f0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
21900 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
21910 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
21920 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
21930 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
21940 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
21950 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
21960 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
21970 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
21980 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
219b0 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
219c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
219d0 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
219e0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
219f0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
21a00 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
21a10 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
21a20 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
21a30 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
21a40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
21a50 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
21a60 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
21a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21a80 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
21a90 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
21aa0 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
21ab0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
21ac0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
21ad0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
21ae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
21af0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
21b00 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
21b10 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
21b20 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
21b30 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
21b40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b60 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
21b70 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
21b80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
21b90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21ba0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21bb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21bc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
21bd0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
21be0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
21bf0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
21c00 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
21c10 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
21c20 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
21c30 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
21c40 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
21c50 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
21c60 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
21c70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21c80 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
21c90 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
21ca0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
21cb0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
21cc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
21cd0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
21ce0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
21cf0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
21d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
21d20 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
21d30 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
21d40 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
21d50 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
21d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
21d80 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
21d90 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
21da0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21db0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21dc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21dd0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
21de0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21df0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21e00 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
21e10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21e20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
21e30 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
21e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21e50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21e60 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
21e70 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
21e80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21e90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
21ea0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
21eb0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
21ec0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
21ed0 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50   lwr, upr;.    P
21ee0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
21ef0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
21f00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21f10 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
21f20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
21f30 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
21f40 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
21f50 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
21f60 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
21f70 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
21f80 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  1;.    if( (!pPa
21f90 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49  ge->intKey && pI
21fa0 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72  dxKey==0) || upr
21fb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
21fc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21fd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
21fe0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
21ff0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69      }.    if( bi
22000 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  asRight ){.     
22010 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22020 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22030 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )upr;.    }else{
22040 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
22050 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
22060 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72  = (u16)((upr+lwr
22070 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
22080 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69  for(;;){.      i
22090 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
220a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
220b0 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ]; /* Index of c
220c0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
220d0 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38  Page */.      u8
220e0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22110 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
22120 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20  pPage */..      
22130 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22140 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c   = 0;.      pCel
22150 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
22160 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
22170 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
22180 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
22190 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
221a0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
221b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
221c0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
221d0 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
221e0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
221f0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
22200 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
22210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22220 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
22230 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
22240 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
22250 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  f( nCellKey==int
22260 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
22270 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
22280 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
22290 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
222a0 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
222b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
222c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
222d0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
222e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
222f0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
22300 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c         pCur->val
22310 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
22320 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
22330 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
22340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22350 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
22360 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
22370 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38  ge-size is 32768
22380 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
22390 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
223a0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
223b0 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
223c0 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
223d0 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
223e0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
223f0 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20  is at most 8198 
22400 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79  bytes, which may
22410 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
22420 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
22430 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
22440 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
22450 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
22460 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
22470 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
22480 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
22490 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
224a0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
224b0 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
224c0 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
224d0 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
224e0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
224f0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
22500 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
22510 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
22520 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
22530 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
22540 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
22550 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c        if( !(nCel
22560 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65  l & 0x80) && nCe
22570 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ll<=pPage->maxLo
22580 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cal ){.         
22590 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
225a0 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
225b0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
225c0 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
225d0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
225e0 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
225f0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
22600 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
22610 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
22620 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
22630 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
22640 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
22650 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
22660 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
22670 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
22680 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22690 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
226a0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
226b0 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
226c0 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
226d0 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
226e0 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
226f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
22700 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
22710 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
22720 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
22730 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
22740 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
22750 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
22760 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
22770 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
22780 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
22790 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
227a0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
227b0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
227c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
227d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
227e0 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
227f0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
22800 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
22810 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
22820 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
22830 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
22840 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
22850 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
22860 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
22870 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
22880 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
22890 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
228a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
228b0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
228c0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
228d0 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
228e0 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  led. */.        
228f0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
22900 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
22910 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
22920 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
22930 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
22940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22950 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
22960 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  tr(pPage, pCellB
22970 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
22980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
22990 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
229a0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
229b0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
229c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
229d0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Cell );.        
229e0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
229f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
22a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22a10 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
22a20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
22a30 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
22a40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
22a50 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
22a60 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
22a70 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
22a80 6c 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  llKey, 0, 0);.  
22a90 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
22aa0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22ab0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
22ac0 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
22ad0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22ae0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
22af0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22b00 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
22b10 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
22b20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22b30 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
22b40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
22b50 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
22b60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
22b70 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
22b80 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
22b90 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
22ba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22bc0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22bd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22be0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
22bf0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
22c00 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
22c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22c20 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
22c30 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
22c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c50 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
22c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22c70 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20   lwr>upr ){.    
22c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22c90 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61   }.      pCur->a
22ca0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22cb0 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75  ] = (u16)((lwr+u
22cc0 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  pr)/2);.    }.  
22cd0 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
22ce0 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  pr+1 );.    asse
22cf0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
22d00 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
22d10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
22d20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20    chldPg = 0;.  
22d30 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
22d40 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
22d50 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
22d60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
22d70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
22d80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
22d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
22da0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
22db0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
22dc0 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
22dd0 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29   if( chldPg==0 )
22de0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22df0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22e00 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
22e10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22e20 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
22e30 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
22e40 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
22e50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22e60 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
22e70 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
22e80 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22e90 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22ea0 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
22eb0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
22ec0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
22ed0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
22ee0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
22ef0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
22f00 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
22f10 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
22f20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
22f30 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
22f40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
22f50 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
22f60 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
22f70 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
22f80 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
22f90 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
22fa0 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
22fb0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
22fc0 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
22fd0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
22fe0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
22ff0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
23000 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
23010 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
23020 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
23030 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
23040 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
23050 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
23060 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
23070 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23080 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
23090 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
230a0 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
230b0 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
230c0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
230d0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
230e0 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
230f0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
23100 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
23110 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
23120 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
23130 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
23140 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
23150 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
23160 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
23170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
23180 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
23190 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
231a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
231b0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
231c0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
231d0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
231e0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
231f0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
23200 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
23210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
23220 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
23230 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
23240 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
23250 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
23260 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
23270 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23280 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23290 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
232a0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
232b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
232c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
232d0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
232e0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
232f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
23300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
23320 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
23330 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
23340 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
23350 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
23360 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
23370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23380 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
23390 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70  >skip>0 ){.    p
233a0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
233b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
233c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
233d0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
233e0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
233f0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
23400 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
23410 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
23420 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23430 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
23440 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
23450 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50   assert( idx<=pP
23460 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
23470 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
23480 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
23490 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
234a0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
234b0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
234c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
234d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
234e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
234f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23500 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
23510 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
23520 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
23530 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
23540 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23550 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
23560 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
23570 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23580 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
23590 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
235a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
235b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
235c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
235d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
235e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
235f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
23600 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
23610 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
23620 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
23630 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23640 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
23650 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
23660 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23670 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
23680 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
23690 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
236a0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
236b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
236c0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
236d0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
236e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
236f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
23700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23710 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
23720 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
23730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23740 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
23750 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
23760 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
23770 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
23780 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
23790 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
237a0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
237b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
237c0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
237d0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
237e0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
237f0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
23800 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
23810 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
23820 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
23830 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
23840 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
23850 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
23860 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
23870 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
23880 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23890 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
238a0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
238b0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
238c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
238d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
238e0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
238f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
23900 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23920 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
23930 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
23940 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
23950 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
23960 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
23970 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
23980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
23990 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c   if( pCur->skip<
239a0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
239b0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
239c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
239d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
239e0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
239f0 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
23a00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23a10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
23a20 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
23a30 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
23a40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
23a50 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
23a60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23a70 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
23a80 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
23a90 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
23aa0 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
23ab0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
23ac0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23ad0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
23ae0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
23af0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
23b00 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
23b10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
23b30 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
23b40 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
23b50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
23b60 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
23b70 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
23b80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23b90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
23ba0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
23bb0 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
23bc0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
23bd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23be0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
23bf0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
23c00 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23c10 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
23c20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
23c30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23c40 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
23c50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
23c60 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
23c70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23c80 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
23c90 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
23ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
23cb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23cc0 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
23cd0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
23ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
23cf0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
23d00 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
23d10 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
23d20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
23d30 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
23d40 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
23d50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23d60 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
23d70 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
23d80 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
23d90 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
23da0 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
23db0 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
23dc0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
23dd0 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
23de0 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
23df0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
23e00 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
23e10 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
23e20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
23e30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23e40 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
23e50 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
23e60 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
23e70 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
23e80 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
23e90 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
23ea0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
23eb0 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
23ec0 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
23ed0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
23ee0 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
23ef0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
23f00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
23f10 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
23f20 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
23f30 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
23f40 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
23f50 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
23f60 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
23f70 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
23f80 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
23f90 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
23fa0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
23fb0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
23fc0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
23fd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
23fe0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
23ff0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
24000 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
24010 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
24020 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
24030 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
24040 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
24050 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
24060 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
24070 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
24080 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
24090 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
240a0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
240b0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
240c0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
240d0 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
240e0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
240f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24100 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
24110 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
24120 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
24130 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
24140 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
24150 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
24160 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
24170 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
24180 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
24190 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
241a0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
241b0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
241c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
241d0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
241e0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
241f0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
24200 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
24210 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
24220 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
24230 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
24240 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
24250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24260 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
24270 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24280 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
24290 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
242a0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
242b0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
242c0 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
242d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
242e0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
242f0 28 20 6e 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  ( n>mxPage ){.  
24300 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24320 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
24330 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
24340 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
24350 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
24360 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
24370 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
24380 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
24390 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
243a0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
243b0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
243c0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
243d0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
243e0 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
243f0 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
24400 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
24410 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
24420 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
24430 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
24440 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
24450 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
24460 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
24470 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
24480 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
24490 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
244a0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
244b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
244c0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
244d0 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50  t && nearby<=mxP
244e0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20  age ){.      u8 
244f0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
24500 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
24510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24520 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
24530 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
24540 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
24550 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
24560 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
24570 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
24580 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
24590 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
245a0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
245b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
245c0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
245d0 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
245e0 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
245f0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
24600 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
24610 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
24620 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
24630 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
24640 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
24650 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
24660 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
24670 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
24680 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
24690 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
246a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
246b0 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
246c0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
246d0 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
246e0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
246f0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
24700 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
24710 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
24720 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
24730 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
24740 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
24750 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
24760 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
24770 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
24780 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
24790 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
247a0 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
247b0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
247c0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
247d0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
247e0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
247f0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
24800 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
24810 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
24820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24830 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
24840 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
24850 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
24860 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54 72   }.      if( iTr
24870 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
24880 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24890 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
248a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
248b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
248c0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
248d0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
248e0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
248f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24900 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
24910 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
24920 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
24930 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
24940 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
24950 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
24960 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
24970 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
24980 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
24990 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
249a0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
249b0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
249c0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
249d0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
249e0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
249f0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
24a00 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
24a10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
24a20 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
24a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24a40 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
24a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24a60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24a70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
24a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
24a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
24aa0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
24ab0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
24ac0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
24ad0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
24ae0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
24af0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
24b00 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
24b10 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
24b20 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
24b30 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
24b40 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
24b50 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
24b60 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
24b70 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
24b80 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
24b90 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
24ba0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
24bb0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
24bc0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
24bd0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
24be0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
24bf0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
24c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24c10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24c20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24c30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
24c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24c50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
24c60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
24c70 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
24c80 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
24c90 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
24ca0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
24cb0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
24cc0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
24cd0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
24ce0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
24cf0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
24d00 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
24d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24d20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
24d30 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
24d40 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
24d50 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
24d60 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
24d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24d80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
24d90 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
24da0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
24db0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
24dc0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
24dd0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
24de0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
24df0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24e00 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
24e10 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
24e20 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
24e30 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
24e40 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
24e50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24e60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24e70 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
24e80 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
24e90 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
24ea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ec0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
24ed0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
24ee0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
24ef0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
24f00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
24f10 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
24f20 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
24f30 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
24f40 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
24f50 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
24f60 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
24f70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24f80 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
24f90 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
24fa0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
24fb0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
24fc0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
24fd0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
24fe0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
24ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25000 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
25010 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
25020 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25030 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
25040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
25060 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
25070 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
25080 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
25090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
250a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
250b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
250c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
250d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
250e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
250f0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
25100 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
25110 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
25120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25130 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
25140 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
25150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
25160 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25170 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
25180 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
25190 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
251a0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
251b0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
251c0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
251d0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
251e0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
251f0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
25200 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
25210 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
25220 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
25230 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
25240 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
25250 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
25260 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
25270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
25280 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
25290 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
252a0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
252b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
252c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
252d0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
252e0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
252f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25310 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
25320 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
25330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25340 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25350 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25360 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25380 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
25390 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
253a0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
253b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
253c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
253d0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
253e0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
253f0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
25400 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
25410 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
25420 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
25430 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25440 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
25450 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
25460 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
25470 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
25480 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
25490 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
254a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
254b0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
254c0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
254d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
254e0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
254f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25500 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25510 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25520 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25540 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
25550 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
25560 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
25570 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
25580 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
25590 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
255a0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
255b0 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
255c0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
255d0 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
255e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
255f0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
25600 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
25610 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
25620 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
25630 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
25640 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
25650 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
25660 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
25670 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25680 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
25690 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
256a0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
256b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
256c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
256d0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
256e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
256f0 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
25700 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
25710 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
25720 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
25730 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
25740 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25750 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25760 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
25770 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25790 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
257a0 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
257b0 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
257c0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
257d0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
257e0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  nPage;.         
257f0 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
25800 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67 65  .          nPage
25810 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
25820 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  t(pBt);.        
25830 20 20 69 66 28 20 69 50 61 67 65 3e 6e 50 61 67    if( iPage>nPag
25840 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
25850 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
25860 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
25870 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
25880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
258a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
258b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
258c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
258d0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
258e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
258f0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
25900 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
25920 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
25930 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
25940 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
25950 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
25960 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
25970 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
25980 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
25990 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
259a0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
259b0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
259c0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
259d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
259e0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
259f0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
25a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
25a10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
25a20 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44  eable(pTrunk->pD
25a30 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
25a40 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
25a50 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
25a60 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
25a70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
25a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
25a90 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
25aa0 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
25ab0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
25ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25ad0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
25ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25af0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
25b00 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
25b10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
25b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
25b40 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
25b50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
25b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25b70 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
25b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
25b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
25ba0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
25bb0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
25bc0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
25bd0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
25be0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
25bf0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
25c00 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
25c10 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
25c20 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
25c30 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
25c40 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
25c50 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
25c60 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
25c70 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  pBt);.    *pPgno
25c80 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20   = nPage + 1;.. 
25c90 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
25ca0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
25cb0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28  (pBt) ){.      (
25cc0 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d  *pPgno)++;.    }
25cd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25ce0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25cf0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
25d00 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
25d10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a  AP_ISPAGE(pBt, *
25d20 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  pPgno) ){.      
25d30 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
25d40 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
25d50 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
25d60 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
25d70 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
25d80 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
25d90 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
25da0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
25db0 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
25dc0 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
25dd0 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
25de0 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
25df0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
25e00 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
25e10 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
25e20 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
25e30 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
25e40 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
25e50 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
25e60 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f  page)\n", *pPgno
25e70 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
25e80 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
25e90 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
25ea0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
25eb0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
25ec0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
25ed0 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
25ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25ef0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
25f00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25f10 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
25f20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
25f30 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
25f40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
25f50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25f60 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
25f70 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
25f80 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
25f90 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
25fa0 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
25fb0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
25fc0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
25fd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
25fe0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
25ff0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
26000 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
26010 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
26020 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
26030 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
26040 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26050 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
26060 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
26070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26080 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26090 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
260a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
260b0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
260c0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
260d0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
260e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
260f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
26100 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
26110 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
26120 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
26130 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
26140 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
26150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26160 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
26170 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
26180 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
26190 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
261a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
261b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
261c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
261d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
261e0 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
261f0 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
26200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
26210 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
26220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26230 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26240 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
26250 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
26260 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26270 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
26280 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
26290 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
262a0 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
262b0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
262c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
262d0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
262e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
262f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
26300 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
26310 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
26320 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
26330 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
26340 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
26350 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
26360 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
26370 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
26380 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
26390 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
263a0 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
263b0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
263c0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
263d0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
263e0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
263f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26400 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
26410 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
26420 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
26430 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
26440 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
26450 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
26460 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
26470 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
26480 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
26490 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
264a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
264b0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
264c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
264d0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
264e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
264f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
26500 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
26510 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
26520 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
26530 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
26540 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
26550 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
26560 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
26590 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
265a0 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265d0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
265e0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
26610 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
26620 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
26630 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26640 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
26650 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
26660 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
26670 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
26680 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
26690 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
266a0 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
266b0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
266c0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
266d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
266e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
266f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
26700 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
26710 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
26720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
26730 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
26740 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
26750 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
26760 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26770 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
26780 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
26790 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
267a0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
267b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
267c0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
267d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
267e0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
267f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26800 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
26810 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  /* If the SQLITE
26820 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63  _SECURE_DELETE c
26830 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
26840 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
26850 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20  hen.  ** always 
26860 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
26870 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
26880 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
26890 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50 61    */.  if( (!pPa
268a0 67 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  ge && (rc = sqli
268b0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
268c0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
268d0 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20 20  ge, 0))).   ||  
268e0 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20            (rc = 
268f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26900 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
26910 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f  )).  ){.    goto
26920 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
26930 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67   }.  memset(pPag
26940 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
26950 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
26960 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
26970 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
26980 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
26990 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
269a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
269b0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
269c0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
269d0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
269e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
269f0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
26a00 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
26a10 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
26a20 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a  P_FREEPAGE, 0);.
26a30 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
26a40 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
26a50 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
26a60 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
26a70 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
26a80 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
26a90 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
26aa0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
26ab0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
26ac0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
26ad0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
26ae0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
26af0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
26b00 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
26b10 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
26b20 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
26b30 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
26b40 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
26b50 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
26b60 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
26b70 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
26b80 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
26b90 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
26ba0 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
26bb0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
26bc0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
26bd0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
26be0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
26bf0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
26c00 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
26c10 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20 20     int nLeaf;   
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c30 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
26c40 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
26c50 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
26c60 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
26c70 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
26c80 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
26c90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
26ca0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
26cb0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
26cc0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26ce0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26cf0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
26d00 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
26d10 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
26d20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
26d30 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
26d40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26d50 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
26d60 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
26d70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
26d80 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  af<pBt->usableSi
26d90 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
26da0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
26db0 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
26dc0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
26dd0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
26de0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
26df0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
26e00 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
26e10 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
26e20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
26e30 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
26e40 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
26e50 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
26e60 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
26e70 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
26e80 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
26e90 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
26ea0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
26eb0 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
26ec0 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
26ed0 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
26ee0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
26ef0 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
26f00 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
26f10 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
26f20 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
26f30 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
26f40 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
26f50 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
26f60 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
26f70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
26f80 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
26f90 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
26fa0 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
26fb0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
26fc0 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
26fd0 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  * we will contai
26fe0 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  n to restrict th
26ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
27000 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
27010 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
27020 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
27030 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
27040 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
27050 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
27060 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
27070 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
27080 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
27090 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
270a0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
270b0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
270c0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
270d0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
270e0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
270f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
27100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27110 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
27120 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
27130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27140 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
27150 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
27160 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
27170 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
27180 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
27190 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
271a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
271b0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
271c0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
271d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
271e0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
271f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
27200 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
27210 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
27220 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
27230 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
27240 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
27250 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
27260 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
27270 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
27280 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
27290 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
272a0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
272b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
272c0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
272d0 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
272e0 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
272f0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
27300 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
27310 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
27320 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
27330 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
27340 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
27350 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
27360 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
27370 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
27380 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
27390 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
273a0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
273b0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
273c0 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
273d0 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
273e0 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
273f0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
27400 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
27410 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
27420 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
27430 28 20 20 20 28 28 21 70 50 61 67 65 29 20 26 26  (   ((!pPage) &&
27440 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
27450 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
27460 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
27470 61 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20 20  age, 0)))).     
27480 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
27490 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
274a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
274b0 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f  )).  ){.    goto
274c0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
274d0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
274e0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
274f0 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
27500 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
27510 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
27520 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27530 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
27540 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
27550 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
27560 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
27570 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
27580 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
27590 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
275a0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
275b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
275c0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
275d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
275e0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
275f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27600 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
27610 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
27620 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  age){.  return f
27630 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
27640 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
27650 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  e->pgno);.}../*.
27660 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
27670 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
27680 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
27690 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74  iven Cell..*/.st
276a0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
276b0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
276c0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
276d0 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68   *pCell){.  BtSh
276e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
276f0 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
27700 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
27710 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
27720 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
27730 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53  .  u16 ovflPageS
27740 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
27750 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27760 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
27770 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
27780 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
27790 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
277a0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
277b0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
277c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
277d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
277e0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
277f0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
27800 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
27810 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
27820 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
27830 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
27840 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
27850 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27860 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
27870 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
27880 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
27890 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
278a0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
278b0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
278c0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
278d0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
278e0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
278f0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
27900 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
27910 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
27920 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
27930 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
27940 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
27950 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
27960 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
27970 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
27980 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
27990 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
279a0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
279b0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
279c0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
279d0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
279e0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
279f0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
27a00 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
27a10 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
27a20 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
27a30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27a40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
27a50 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
27a60 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
27a70 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
27a80 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
27a90 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
27aa0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
27ab0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
27ac0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
27ad0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
27ae0 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66  o);.    if( pOvf
27af0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
27b00 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
27b10 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
27b20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
27b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27b40 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
27b50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27b60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27b70 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
27b80 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
27b90 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
27ba0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
27bb0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
27bc0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
27bd0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
27be0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
27bf0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
27c00 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
27c10 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
27c20 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
27c30 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
27c40 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
27c50 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
27c60 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
27c70 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
27c80 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
27c90 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
27ca0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
27cb0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
27cc0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
27cd0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
27ce0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
27cf0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
27d00 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
27d10 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
27d20 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
27d30 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
27d40 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
27d50 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
27d60 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
27d70 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
27d80 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
27d90 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
27da0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
27db0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
27dc0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
27dd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
27de0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
27df0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
27e00 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
27e10 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
27e20 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
27e30 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
27e40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
27e50 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
27e60 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
27e70 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e90 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
27ea0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
27eb0 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
27ec0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
27ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
27ee0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
27ef0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
27f00 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
27f10 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
27f20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
27f30 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
27f40 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
27f50 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
27f60 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
27f70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
27f80 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
27f90 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
27fa0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
27fb0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
27fc0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
27fd0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
27fe0 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
27ff0 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
28000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28010 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28020 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
28030 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
28040 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
28050 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
28060 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
28070 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
28080 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
28090 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
280a0 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
280b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
280c0 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
280d0 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
280e0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
280f0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
28100 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
28110 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
28120 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
28130 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
28140 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
28150 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
28160 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
28170 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
28180 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
28190 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
281a0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
281b0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
281c0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
281d0 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
281e0 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
281f0 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
28200 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
28210 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
28220 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
28230 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  y);.  sqlite3Btr
28240 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
28250 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
28260 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
28270 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
28280 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
28290 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
282a0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
282b0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
282c0 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
282d0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
282e0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
282f0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
28300 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
28310 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
28320 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
28330 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
28340 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
28350 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
28360 20 20 20 20 69 66 28 20 6e 4b 65 79 3e 30 78 37      if( nKey>0x7
28370 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d  fffffff || pKey=
28380 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
28390 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
283a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
283b0 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b  yload += (int)nK
283c0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
283d0 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
283e0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
283f0 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
28400 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
28410 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
28420 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
28430 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
28440 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
28450 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
28460 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
28470 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
28480 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
28490 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
284a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
284b0 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
284c0 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
284d0 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
284e0 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
284f0 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
28500 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
28510 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
28520 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
28530 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
28540 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
28550 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
28560 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
28570 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
28580 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
28590 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
285a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
285b0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
285c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
285d0 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
285e0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
285f0 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
28600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
28610 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
28620 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
28630 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
28640 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
28650 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
28660 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
28670 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
28680 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
28690 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
286a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
286b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
286c0 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
286d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
286e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
286f0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
28700 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
28710 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
28720 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
28730 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
28740 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
28750 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
28760 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
28770 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
28780 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
28790 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
287a0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
287b0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
287c0 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
287d0 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
287e0 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
287f0 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
28800 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
28810 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
28820 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
28830 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
28840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28850 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
28860 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
28870 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
28880 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
28890 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
288a0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
288b0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
288c0 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20  pgnoPtrmap);.   
288d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
288e0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
288f0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
28900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
28910 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
28920 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
28930 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
28940 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
28950 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28960 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
28970 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
28980 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
28990 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
289a0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
289b0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
289c0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
289d0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
289e0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
289f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28a00 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
28a10 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28a20 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
28a30 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
28a40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
28a50 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
28a60 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
28a70 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
28a80 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
28a90 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
28aa0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
28ab0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
28ac0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
28ad0 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
28ae0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
28af0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
28b00 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
28b10 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
28b20 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
28b30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
28b40 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
28b50 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
28b60 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
28b70 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
28b80 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
28b90 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
28ba0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
28bb0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
28bc0 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
28bd0 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
28be0 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
28bf0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
28c00 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
28c10 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
28c20 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
28c30 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
28c40 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
28c50 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
28c60 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
28c70 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
28c80 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
28c90 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
28ca0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
28cb0 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
28cc0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
28cd0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
28ce0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
28cf0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
28d00 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
28d10 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
28d20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
28d30 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
28d40 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
28d50 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
28d60 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
28d70 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
28d80 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
28d90 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
28da0 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
28db0 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
28dc0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
28dd0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
28de0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
28df0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28e00 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
28e10 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
28e20 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
28e30 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
28e40 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
28e50 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
28e60 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
28e70 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
28e80 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
28e90 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
28ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
28eb0 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
28ec0 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
28ed0 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
28ee0 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
28ef0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
28f00 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
28f10 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
28f20 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
28f30 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
28f40 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
28f50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
28f60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28f70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
28f80 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
28f90 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
28fa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
28fb0 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
28fc0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
28fd0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
28fe0 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
28ff0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
29000 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
29010 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
29020 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
29030 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
29040 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
29050 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
29060 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
29070 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
29080 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
29090 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
290a0 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
290b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
290c0 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
290d0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
290e0 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74  , int sz){.  int
290f0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
29100 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
29110 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
29120 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
29130 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
29140 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
29150 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
29160 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
29170 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
29180 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
29190 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
291a0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
291b0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
291c0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
291d0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
291e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  /..  assert( idx
291f0 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
29200 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
29210 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
29220 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
29230 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29240 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29250 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
29260 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
29270 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29280 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
29290 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
292a0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
292b0 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50    ptr = &data[pP
292c0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
292d0 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  + 2*idx];.  pc =
292e0 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
292f0 20 20 69 66 28 20 28 70 63 3c 70 50 61 67 65 2d    if( (pc<pPage-
29300 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50  >hdrOffset+6+(pP
29310 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29 0a  age->leaf?0:4)).
29320 20 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70       || (pc+sz>p
29330 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
29340 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65  eSize) ){.    re
29350 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29360 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
29370 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
29380 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
29390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
293a0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
293b0 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69   rc;.  }.  for(i
293c0 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
293d0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
293e0 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
293f0 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
29400 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
29410 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
29420 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
29430 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
29440 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
29450 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
29460 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
29470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29480 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
29490 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
294a0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
294b0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
294c0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
294d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
294e0 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
294f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
29500 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
29510 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
29520 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
29530 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
29540 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
29550 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
29560 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
29570 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
29580 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
29590 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
295a0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
295b0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
295c0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
295d0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
295e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
295f0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
29600 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
29610 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
29620 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
29630 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
29640 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
29650 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
29660 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
29670 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
29680 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
29690 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
296a0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
296b0 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
296c0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
296d0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
296e0 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
296f0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
29700 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
29710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
29720 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
29730 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
29740 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
29750 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
29760 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
29770 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
29780 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
29790 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
297a0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
297b0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
297c0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
297d0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
297e0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
297f0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
29800 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
29810 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
29820 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
29830 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
29840 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
29850 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
29860 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
29870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
29880 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
29890 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
298a0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
298b0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
298c0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
298d0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
298e0 67 6e 6f 20 69 43 68 69 6c 64 20 20 20 20 20 20  gno iChild      
298f0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
29900 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
29910 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
29920 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69   value */.){.  i
29930 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
29940 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
29950 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
29960 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
29970 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
29980 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29990 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
299a0 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
299b0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
299c0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
299d0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
299e0 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
299f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
29a00 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
29a10 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
29a20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
29a30 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
29a40 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
29a50 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
29a60 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
29a70 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
29a80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
29a90 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
29aa0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
29ab0 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tr;          /* 
29ac0 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20  Used for moving 
29ad0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75  information arou
29ae0 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nd in data[] */.
29af0 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
29b00 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
29b10 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
29b20 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
29b30 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
29b40 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
29b50 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
29b60 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
29b70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
29b80 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
29b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29ba0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
29bb0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
29bc0 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  >aOvfl) );.  ass
29bd0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
29be0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
29bf0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
29c00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29c10 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
29c20 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
29c30 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
29c40 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
29c50 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
29c60 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
29c70 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
29c80 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
29c90 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
29ca0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
29cb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
29cc0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
29cd0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
29ce0 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
29cf0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
29d00 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
29d10 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
29d20 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
29d30 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
29d40 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  aOvfl[0])) );.  
29d50 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
29d60 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
29d70 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
29d80 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29  l[j].idx = (u16)
29d90 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
29da0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
29db0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
29dc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29de0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
29df0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
29e00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
29e10 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29e20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
29e30 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
29e40 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
29e50 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
29e60 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
29e70 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
29e80 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
29e90 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d  nCell;.    ins =
29ea0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
29eb0 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  i;.    rc = allo
29ec0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
29ed0 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20   sz, &idx);.    
29ee0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29ef0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
29f00 69 64 78 3e 3d 65 6e 64 2b 32 20 29 3b 0a 20 20  idx>=end+2 );.  
29f10 20 20 69 66 28 20 69 64 78 2b 73 7a 20 3e 20 70    if( idx+sz > p
29f20 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
29f30 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
29f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29f50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
29f60 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
29f70 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
29f80 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
29f90 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
29fa0 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
29fb0 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
29fc0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
29fd0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
29fe0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
29ff0 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
2a000 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
2a010 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74  (j=end, ptr=&dat
2a020 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
2a030 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
2a040 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
2a050 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
2a060 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
2a070 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
2a080 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
2a090 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2a0a0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2a0b0 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
2a0c0 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  nCell);.#ifndef 
2a0d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a0e0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2a0f0 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
2a100 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
2a110 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
2a120 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
2a130 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2a140 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
2a150 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
2a160 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
2a170 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
2a180 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2a190 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a1a0 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
2a1b0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2a1c0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23 65  pCell);.    }.#e
2a1d0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
2a1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a1f0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2a200 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2a210 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2a220 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2a230 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2a240 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2a250 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2a260 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2a270 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2a280 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2a290 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2a2a0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2a2b0 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2a2c0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2a2d0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2a2e0 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2a2f0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2a300 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2a310 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2a320 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2a330 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2a340 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2a350 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2a360 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2a370 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2a380 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2a390 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2a3a0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2a3b0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2a3c0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2a3d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2a3e0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2a3f0 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2a400 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2a410 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2a420 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2a430 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2a440 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2a450 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2a460 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2a470 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2a480 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2a490 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2a4a0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2a4b0 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2a4c0 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2a4d0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2a4e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2a4f0 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2a500 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a510 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2a520 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2a530 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2a540 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28   nCell<=MX_CELL(
2a550 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2a560 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2a570 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
2a580 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2a590 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2a5a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2a5b0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2a5c0 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a  t the page has j
2a5d0 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ust been zeroed 
2a5e0 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f  by zeroPage() */
2a5f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a600 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2a610 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2a620 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d  (&data[hdr+5])==
2a630 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43  nUsable );..  pC
2a640 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70  ellptr = &data[p
2a650 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2a660 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63   + nCell*2];.  c
2a670 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c  ellbody = nUsabl
2a680 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c  e;.  for(i=nCell
2a690 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
2a6a0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
2a6b0 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
2a6c0 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20  -= aSize[i];.   
2a6d0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
2a6e0 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
2a6f0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2a700 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
2a710 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
2a720 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
2a730 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
2a740 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
2a750 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
2a760 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2a770 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
2a780 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
2a790 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2a7a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
2a7b0 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
2a7c0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2a7d0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
2a7e0 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
2a7f0 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
2a800 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
2a810 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
2a820 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
2a830 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
2a840 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2a850 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
2a860 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
2a870 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2a880 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2a890 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
2a8a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2a8b0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
2a8c0 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
2a8d0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
2a8e0 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
2a8f0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2a900 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
2a910 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
2a920 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
2a930 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
2a940 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
2a950 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
2a960 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
2a970 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
2a980 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
2a990 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
2a9a0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
2a9b0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
2a9c0 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
2a9d0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
2a9e0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
2a9f0 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
2aa00 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
2aa10 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
2aa20 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
2aa30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2aa40 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2aa50 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2aa60 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
2aa70 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
2aa80 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
2aa90 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
2aaa0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
2aab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2aac0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2aad0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
2aae0 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
2aaf0 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
2ab00 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
2ab10 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
2ab20 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
2ab30 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
2ab40 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
2ab50 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
2ab60 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
2ab70 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
2ab80 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
2ab90 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
2aba0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
2abb0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
2abc0 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
2abd0 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
2abe0 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
2abf0 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
2ac00 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
2ac10 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
2ac20 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
2ac30 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
2ac40 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
2ac50 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
2ac60 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
2ac70 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
2ac80 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
2ac90 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
2aca0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
2acb0 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
2acc0 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
2acd0 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
2ace0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
2acf0 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
2ad00 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
2ad10 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
2ad20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
2ad30 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
2ad40 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
2ad50 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
2ad60 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
2ad70 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
2ad80 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
2ad90 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
2ada0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
2adb0 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
2adc0 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
2add0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2ade0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
2adf0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
2ae00 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
2ae10 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
2ae20 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
2ae30 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
2ae40 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
2ae50 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
2ae60 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
2ae70 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
2ae80 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
2ae90 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2aea0 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
2aeb0 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
2aec0 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
2aed0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
2aee0 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
2aef0 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
2af00 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2af10 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
2af20 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
2af30 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
2af40 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
2af50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
2af60 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
2af70 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
2af80 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
2af90 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
2afc0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2afd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aff0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b000 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
2b010 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2b040 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
2b050 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2b060 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2b070 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2b080 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2b090 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2b0a0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2b0b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b0c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2b0d0 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  =1 );..  if( pPa
2b0e0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72  ge->nCell<=0 ) r
2b0f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2b100 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
2b110 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
2b120 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
2b130 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2b140 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
2b150 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
2b160 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
2b170 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
2b180 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
2b190 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
2b1a0 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
2b1b0 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
2b1c0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
2b1d0 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
2b1e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
2b1f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2b200 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
2b210 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
2b220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b230 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
2b240 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
2b250 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
2b260 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
2b270 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20  .pCell;.    u16 
2b280 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
2b290 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2b2a0 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
2b2b0 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
2b2c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2b2d0 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
2b2e0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
2b2f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
2b300 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
2b310 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2b320 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
2b330 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
2b340 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2b350 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2b360 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
2b370 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
2b380 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a  ell, &szCell);..
2b390 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2b3a0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2b3b0 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2b3c0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
2b3d0 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
2b3e0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
2b3f0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
2b400 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
2b410 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2b420 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
2b430 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2b440 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
2b450 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
2b460 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
2b470 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
2b480 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
2b490 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
2b4a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
2b4b0 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
2b4c0 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
2b4d0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
2b4e0 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
2b4f0 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
2b500 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
2b510 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
2b520 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2b530 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
2b540 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
2b550 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
2b560 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
2b570 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
2b580 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
2b590 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2b5a0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2b5b0 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2b5c0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2b5d0 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
2b5e0 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2b5f0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2b600 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
2b610 6e 4c 6f 63 61 6c 20 26 26 20 72 63 3d 3d 53 51  nLocal && rc==SQ
2b620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b630 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2b640 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
2b650 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cell);.      }. 
2b660 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43     }.  .    /* C
2b670 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20  reate a divider 
2b680 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69  cell to insert i
2b690 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65  nto pParent. The
2b6a0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
2b6b0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66    ** consists of
2b6c0 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e   a 4-byte page n
2b6d0 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20  umber (the page 
2b6e0 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29  number of pPage)
2b6f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61   and.    ** a va
2b700 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
2b710 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d  y value (which m
2b720 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
2b730 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20  value as the.   
2b740 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20   ** largest key 
2b750 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a  on pPage)..    *
2b760 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64  *.    ** To find
2b770 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2b780 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c   value on pPage,
2b790 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20   first find the 
2b7a0 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20  right-most .    
2b7b0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2b7c0 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
2b7d0 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63  fields of this c
2b7e0 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20  ell are the .   
2b7f0 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74   ** record-lengt
2b800 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  h (a variable le
2b810 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20  ngth integer at 
2b820 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20  most 32-bits in 
2b830 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64  size).    ** and
2b840 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28   the key value (
2b850 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2b860 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68  h integer, may h
2b870 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a  ave any value)..
2b880 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
2b890 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e   of the while(..
2b8a0 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73  .) loops below s
2b8b0 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65  kips over the re
2b8c0 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20  cord-length.    
2b8d0 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65  ** field. The se
2b8e0 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20  cond while(...) 
2b8f0 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20  loop copies the 
2b900 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  key value from t
2b910 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  he.    ** cell o
2b920 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65  n pPage into the
2b930 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a   pSpace buffer..
2b940 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c      */.    pCell
2b950 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2b960 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
2b970 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
2b980 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2b990 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
2b9a0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2b9b0 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
2b9c0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2b9d0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
2b9e0 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
2b9f0 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
2ba00 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
2ba10 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
2ba20 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2ba30 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  l into pParent. 
2ba40 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  */.    insertCel
2ba50 6c 28 70 50 61 72 65 6e 74 2c 70 50 61 72 65 6e  l(pParent,pParen
2ba60 74 2d 3e 6e 43 65 6c 6c 2c 70 53 70 61 63 65 2c  t->nCell,pSpace,
2ba70 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2ba80 65 29 2c 30 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  e),0,pPage->pgno
2ba90 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
2baa0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
2bab0 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
2bac0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2bad0 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
2bae0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2baf0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2bb00 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2bb10 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
2bb20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
2bb30 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2bb40 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
2bb50 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2bb60 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
2bb70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2bb80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2bb90 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
2bba0 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
2bbb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2bbc0 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
2bbd0 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
2bbe0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
2bbf0 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
2bc00 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
2bc10 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
2bc20 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
2bc30 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
2bc40 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
2bc50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2bc60 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
2bc70 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
2bc80 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
2bc90 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
2bca0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
2bcb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
2bcc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
2bcd0 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
2bce0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2bcf0 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
2bd00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2bd10 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2bd20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bd30 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
2bd40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
2bd50 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
2bd60 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
2bd70 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
2bd80 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
2bd90 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2bda0 20 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   j);.      sqlit
2bdb0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
2bdc0 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
2bdd0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2bde0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
2bdf0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
2be00 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
2be10 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
2be20 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
2be30 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
2be40 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2be50 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2be60 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2be70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
2be80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2be90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2bea0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
2beb0 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2bec0 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
2bed0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2bee0 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2bef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2bf00 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2bf10 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2bf20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2bf30 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2bf40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
2bf50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2bf60 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2bf70 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2bf80 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
2bf90 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2bfa0 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2bfb0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2bfc0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2bfd0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2bfe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2bff0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
2c000 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2c010 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2c020 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2c030 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
2c040 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
2c050 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
2c060 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
2c070 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
2c080 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
2c090 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
2c0a0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
2c0b0 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
2c0c0 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
2c0d0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
2c0e0 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
2c0f0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
2c100 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
2c110 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
2c120 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
2c130 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
2c140 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
2c150 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
2c160 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
2c170 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
2c180 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
2c190 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
2c1a0 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
2c1b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
2c1c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
2c1d0 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
2c1e0 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
2c1f0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
2c200 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61  age.aOvfl[] arra
2c210 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
2c220 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
2c230 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
2c240 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
2c250 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
2c260 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2c270 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
2c280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
2c290 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
2c2a0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
2c2b0 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
2c2c0 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
2c2d0 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
2c2e0 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
2c2f0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
2c300 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
2c310 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
2c320 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
2c330 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
2c340 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
2c350 74 69 63 20 69 6e 74 20 63 6f 70 79 4e 6f 64 65  tic int copyNode
2c360 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
2c370 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
2c380 2a 70 54 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  *pTo){.  BtShare
2c390 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
2c3a0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 75 38  pFrom->pBt;.  u8
2c3b0 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
2c3c0 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
2c3d0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
2c3e0 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
2c3f0 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48  int const iFromH
2c400 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f  dr = pFrom->hdrO
2c410 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 63 6f 6e  ffset;.  int con
2c420 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
2c430 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
2c440 30 20 3a 20 30 29 3b 0a 20 20 69 6e 74 20 72 63  0 : 0);.  int rc
2c450 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c460 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 61 73  int iData;..  as
2c470 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
2c480 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2c490 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
2c4a0 54 6f 48 64 72 20 29 3b 0a 20 20 61 73 73 65 72  ToHdr );.  asser
2c4b0 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
2c4c0 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c  om[iFromHdr+5])<
2c4d0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2c4e0 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74   );..  /* Copy t
2c4f0 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63  he b-tree node c
2c500 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65  ontent from page
2c510 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
2c520 54 6f 2e 20 2a 2f 0a 20 20 69 44 61 74 61 20 3d  To. */.  iData =
2c530 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2c540 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
2c550 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
2c560 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
2c570 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
2c580 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 6d 65  ize-iData);.  me
2c590 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72  mcpy(&aTo[iToHdr
2c5a0 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  ], &aFrom[iFromH
2c5b0 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c  dr], pFrom->cell
2c5c0 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d  Offset + 2*pFrom
2c5d0 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  ->nCell);..  /* 
2c5e0 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
2c5f0 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
2c600 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2c610 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
2c620 75 72 65 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74  ure.  ** match t
2c630 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65  he new data. The
2c640 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2c650 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22 20  of pTo "cannot" 
2c660 66 61 69 6c 2c 20 61 73 20 74 68 65 0a 20 20 2a  fail, as the.  *
2c670 2a 20 64 61 74 61 20 63 6f 70 69 65 64 20 66 72  * data copied fr
2c680 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b 6e 6f 77  om pFrom is know
2c690 6e 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 20 20  n to be valid.  
2c6a0 2a 2f 0a 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  */.  pTo->isInit
2c6b0 20 3d 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   = 0;.  TESTONLY
2c6c0 28 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42  (rc = ) sqlite3B
2c6d0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
2c6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
2c6f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
2c700 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2c710 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2c720 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2c730 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2c740 6e 74 72 69 65 73 0a 20 20 2a 2a 20 66 6f 72 20  ntries.  ** for 
2c750 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
2c760 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
2c770 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
2c780 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
2c790 74 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  to. */.  if( ISA
2c7a0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2c7b0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
2c7c0 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 7d 0a  rmaps(pTo);.  }.
2c7d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c7e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2c7f0 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
2c800 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50   cells on the iP
2c810 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c  arentIdx'th chil
2c820 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20  d of pParent.** 
2c830 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20  (hereafter "the 
2c840 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f  page") and up to
2c850 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74   2 siblings so t
2c860 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
2c870 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ve about the.** 
2c880 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
2c890 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c  ree space. Usual
2c8a0 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c  ly a single sibl
2c8b0 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ing on either si
2c8c0 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  de of the.** pag
2c8d0 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  e are used in th
2c8e0 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f  e balancing, tho
2c8f0 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67  ugh both sibling
2c900 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
2c910 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66  m one.** side if
2c920 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
2c930 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63   first or last c
2c940 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
2c950 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  nt. If the page 
2c960 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68  .** has fewer th
2c970 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73  an 2 siblings (s
2c980 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
2c990 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
2c9a0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  f the page.** is
2c9b0 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20   a root page or 
2c9c0 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f  a child of a roo
2c9d0 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c  t page) then all
2c9e0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
2c9f0 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61  ngs.** participa
2ca00 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
2ca10 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
2ca20 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2ca30 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69  s of the page mi
2ca40 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
2ca50 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
2ca60 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20   .** one or two 
2ca70 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
2ca80 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
2ca90 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
2caa0 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a  ver full. .**.**
2cab0 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
2cac0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2cad0 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
2cae0 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  the cells on the
2caf0 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e   page.** might n
2cb00 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
2cb10 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65  tored in MemPage
2cb20 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63  .aData[]. This c
2cb30 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
2cb40 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
2cb50 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69  full. This routi
2cb60 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
2cb70 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61  all cells alloca
2cb80 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ted.** to the pa
2cb90 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2cba0 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d  ngs fit into Mem
2cbb0 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66  Page.aData[] bef
2cbc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2cbd0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
2cbe0 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
2cbf0 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
2cc00 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73   siblings, cells
2cc10 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72   may be.** inser
2cc20 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f  ted into or remo
2cc30 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ved from the par
2cc40 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e  ent page (pParen
2cc50 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20  t). Doing so.** 
2cc60 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61  may cause the pa
2cc70 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63  rent page to bec
2cc80 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
2cc90 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68  underfull. If th
2cca0 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69  is.** happens, i
2ccb0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
2ccc0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
2ccd0 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20  aller to invoke 
2cce0 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62  the correct.** b
2ccf0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
2cd00 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f   to fix this pro
2cd10 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61  blem (see the ba
2cd20 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29  lance() routine)
2cd30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  . .**.** If this
2cd40 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
2cd50 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
2cd60 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
2cd70 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
2cd80 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
2cd90 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72  te. So if this r
2cda0 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
2cdb0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
2cdc0 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
2cdd0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ack..**.** The t
2cde0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
2cdf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2ce00 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61  aOvflSpace, is a
2ce10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
2ce20 20 62 75 66 66 65 72 20 70 61 67 65 2d 73 69 7a   buffer page-siz
2ce30 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  e bytes in size.
2ce40 20 49 66 2c 20 69 6e 20 69 6e 73 65 72 74 69 6e   If, in insertin
2ce50 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
2ce60 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
2ce70 28 70 50 61 72 65 6e 74 29 2c 20 74 68 65 20 70  (pParent), the p
2ce80 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
2ce90 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69  es overfull, thi
2cea0 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75  s buffer is.** u
2ceb0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
2cec0 20 70 61 72 65 6e 74 73 20 6f 76 65 72 66 6c 6f   parents overflo
2ced0 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
2cee0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2cef0 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
2cf00 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
2cf10 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
2cf20 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
2cf30 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
2cf40 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
2cf50 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
2cf60 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
2cf70 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
2cf80 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
2cf90 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
2cfa0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
2cfb0 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
2cfc0 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
2cfd0 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
2cfe0 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
2cff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
2d000 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
2d010 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
2d020 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2d030 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2d040 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
2d050 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
2d060 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65  nroot(.  MemPage
2d070 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
2d080 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
2d090 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69  nt page of sibli
2d0a0 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ngs being balanc
2d0b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
2d0c0 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20  entIdx,         
2d0d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d0e0 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69   of "the page" i
2d0f0 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75  n pParent */.  u
2d100 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20  8 *aOvflSpace,  
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d120 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  * page-size byte
2d130 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70  s of space for p
2d140 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20  arent ovfl */.  
2d150 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20  int isRoot      
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d170 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
2d180 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  nt is a root-pag
2d190 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
2d1a0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2d1b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2d1c0 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
2d1d0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d1f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2d200 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2d210 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
2d220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d230 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
2d240 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
2d250 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
2d260 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d280 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2d290 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
2d2a0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
2d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d2c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2d2d0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
2d2e0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d300 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2d310 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
2d340 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
2d350 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
2d360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d370 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  K;          /* T
2d380 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2d390 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72  /.  u16 leafCorr
2d3a0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
2d3b0 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
2d3c0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2d3d0 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
2d3e0 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
2d3f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d400 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2d410 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
2d420 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2d430 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
2d440 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
2d450 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
2d460 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
2d470 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
2d480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2d490 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
2d4a0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
2d4b0 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
2d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2d4d0 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
2d4e0 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
2d4f0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
2d500 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
2d510 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2d520 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
2d530 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
2d540 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b   iOvflSpace = 0;
2d550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d560 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2d570 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a  f aOvflSpace[] *
2d580 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
2d590 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2d5a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
2d5b0 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
2d5c0 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
2d5d0 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
2d5e0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2d5f0 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
2d600 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50  blings */.  MemP
2d610 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
2d620 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
2d630 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
2d640 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
2d650 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
2d660 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
2d670 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2d680 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
2d690 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
2d6a0 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20    u8 *pRight;   
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d6c0 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61  * Location in pa
2d6d0 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69  rent of right-si
2d6e0 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f  bling pointer */
2d6f0 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d  .  u8 *apDiv[NB-
2d700 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
2d710 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
2d720 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2d730 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
2d740 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2d750 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
2d760 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
2d770 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
2d780 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
2d790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2d7a0 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
2d7b0 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
2d7c0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
2d7d0 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
2d7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2d7f0 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
2d800 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2d810 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2d820 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2d830 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2d840 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2d850 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
2d860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d870 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
2d880 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
2d890 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
2d8a0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
2d8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2d8c0 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
2d8d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2d8e0 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72  */..  pBt = pPar
2d8f0 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
2d900 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2d910 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2d920 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2d930 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2d940 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2d950 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
2d960 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
2d970 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
2d980 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
2d990 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2d9a0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2d9b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2d9c0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
2d9d0 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
2d9e0 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
2d9f0 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
2da00 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
2da10 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
2da20 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
2da30 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
2da40 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
2da50 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
2da60 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
2da70 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2da80 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
2da90 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
2daa0 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
2dab0 44 65 6c 65 74 65 28 29 2e 20 2a 2f 0a 20 20 61  Delete(). */.  a
2dac0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
2dad0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2dae0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2daf0 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ow==1 );.  asser
2db00 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
2db10 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
2db20 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  ent->aOvfl[0].id
2db30 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b  x==iParentIdx );
2db40 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70  ..  if( !aOvflSp
2db50 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ace ){.    retur
2db60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2db70 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
2db80 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
2db90 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73   to balance. Als
2dba0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  o locate the cel
2dbb0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20  ls in pParent . 
2dbc0 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20   ** that divide 
2dbd0 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e  the siblings. An
2dbe0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2dbf0 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c   to find NN sibl
2dc00 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69  ings on .  ** ei
2dc10 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2dc20 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67  ge. More sibling
2dc30 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
2dc40 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76   one side, howev
2dc50 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  er, .  ** if the
2dc60 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
2dc70 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
2dc80 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
2dc90 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
2dca0 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
2dcb0 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
2dcc0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
2dcd0 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
2dce0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
2dcf0 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f  is loop also dro
2dd00 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ps the divider c
2dd10 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ells from the pa
2dd20 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a  rent page. This.
2dd30 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65    ** way, the re
2dd40 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66  mainder of the f
2dd50 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2dd60 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69   have to deal wi
2dd70 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72  th any.  ** over
2dd80 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68  flow cells in th
2dd90 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61  e parent page, a
2dda0 73 20 69 66 20 6f 6e 65 20 65 78 69 73 74 65 64  s if one existed
2ddb0 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a   it has already.
2ddc0 20 20 2a 2a 20 62 65 65 6e 20 72 65 6d 6f 76 65    ** been remove
2ddd0 64 2e 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  d.  */.  i = pPa
2dde0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2ddf0 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
2de00 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
2de10 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2de20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
2de30 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20  }else{.    nOld 
2de40 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61  = 3;.    if( iPa
2de50 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
2de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
2de70 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
2de80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
2de90 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
2dea0 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
2deb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2dec0 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
2ded0 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
2dee0 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20     i = 2;.  }.  
2def0 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
2df00 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2df10 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2df20 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
2df30 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
2df40 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2df50 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
2df60 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
2df70 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2df80 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
2df90 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
2dfa0 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
2dfb0 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
2dfc0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
2dfd0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2dfe0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
2dff0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
2e000 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
2e010 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 69 2a  set(apOld, 0, i*
2e020 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
2e030 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61  );.      goto ba
2e040 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2e050 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c     }.    nMaxCel
2e060 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
2e070 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
2e080 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
2e090 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20   if( (i--)==0 ) 
2e0a0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20  break;..    if( 
2e0b0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2e0c0 6f 77 20 26 26 20 69 2b 6e 78 44 69 76 3d 3d 70  ow && i+nxDiv==p
2e0d0 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
2e0e0 2e 69 64 78 20 29 7b 0a 20 20 20 20 20 20 61 70  .idx ){.      ap
2e0f0 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74  Div[i] = pParent
2e100 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
2e110 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
2e120 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
2e130 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
2e140 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2e150 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
2e160 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ]);.      pParen
2e170 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  t->nOverflow = 0
2e180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e190 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
2e1a0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2e1b0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
2e1c0 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >nOverflow);.   
2e1d0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2e1e0 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
2e1f0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
2e200 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
2e210 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a  nt, apDiv[i]);..
2e220 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68        /* Drop th
2e230 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20  e cell from the 
2e240 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44  parent page. apD
2e250 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e  iv[i] still poin
2e260 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  ts to.      ** t
2e270 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74  he cell within t
2e280 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20  he parent, even 
2e290 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65  though it has be
2e2a0 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20  en dropped..    
2e2b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66    ** This is saf
2e2c0 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69  e because droppi
2e2d0 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f  ng a cell only o
2e2e0 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69  verwrites the fi
2e2f0 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
2e300 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61  r bytes of it, a
2e310 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2e320 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2e330 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
2e340 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
2e350 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2e360 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  . So the pointer
2e370 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a   is safe to use.
2e380 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f        ** later o
2e390 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  n.  .      **.  
2e3a0 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51      ** Unless SQ
2e3b0 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
2e3c0 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   in secure-delet
2e3d0 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  e mode. In this 
2e3e0 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  case,.      ** t
2e3f0 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
2e400 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
2e410 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
2e420 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
2e430 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
2e440 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
2e450 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
2e460 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
2e470 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
2e480 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
2e490 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
2e4a0 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
2e4b0 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
2e4c0 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
2e4d0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
2e4e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
2e4f0 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
2e500 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53    memcpy(&aOvflS
2e510 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
2e520 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 2c 20 61  arent->aData], a
2e530 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
2e540 5d 29 3b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  ]);.      apDiv[
2e550 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  i] = &aOvflSpace
2e560 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
2e570 74 2d 3e 61 44 61 74 61 5d 3b 0a 23 65 6e 64 69  t->aData];.#endi
2e580 66 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  f.      dropCell
2e590 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2e5a0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2e5b0 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b  flow, szNew[i]);
2e5c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2e5d0 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
2e5e0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
2e5f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
2e600 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
2e610 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
2e620 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
2e630 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
2e640 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
2e650 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
2e660 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
2e670 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
2e680 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
2e690 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
2e6a0 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
2e6b0 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
2e6c0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6e0 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
2e6f0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
2e700 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
2e730 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
2e740 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
2e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e760 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
2e770 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
2e780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
2e7b0 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
2e7c0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
2e7d0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
2e7e0 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
2e7f0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
2e800 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2e810 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2e820 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2e830 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
2e840 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
2e850 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
2e860 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
2e870 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
2e880 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2e890 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2e8a0 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
2e8b0 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
2e8c0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
2e8d0 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
2e8e0 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
2e8f0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2e900 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
2e910 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
2e920 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2e930 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2e940 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
2e950 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
2e960 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
2e970 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
2e980 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
2e990 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
2e9a0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
2e9b0 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
2e9c0 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
2e9d0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2e9e0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
2e9f0 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
2ea00 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
2ea10 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
2ea20 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
2ea30 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
2ea40 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
2ea50 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2ea60 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
2ea70 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
2ea80 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
2ea90 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2eaa0 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
2eab0 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
2eac0 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
2ead0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
2eae0 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
2eaf0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
2eb00 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
2eb10 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
2eb20 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
2eb30 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
2eb40 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
2eb50 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
2eb60 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
2eb70 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
2eb80 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
2eb90 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
2eba0 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
2ebb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
2ebc0 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
2ebd0 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
2ebe0 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
2ebf0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2ec00 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
2ec10 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
2ec20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
2ec30 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
2ec40 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
2ec50 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
2ec60 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
2ec70 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
2ec80 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2ec90 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
2eca0 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
2ecb0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
2ecc0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2ecd0 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
2ece0 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
2ecf0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
2ed00 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
2ed10 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
2ed20 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
2ed30 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
2ed40 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
2ed50 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
2ed60 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
2ed70 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
2ed80 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
2ed90 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
2eda0 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
2edb0 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
2edc0 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
2edd0 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
2ede0 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
2edf0 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
2ee00 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
2ee10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
2ee20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
2ee30 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
2ee40 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2ee50 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2ee60 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2ee70 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2ee80 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
2ee90 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2eea0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
2eeb0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
2eec0 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
2eed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2eee0 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61  i<nOld-1 && !lea
2eef0 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31  fData){.      u1
2ef00 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65  6 sz = (u16)szNe
2ef10 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a  w[i];.      u8 *
2ef20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  pTemp;.      ass
2ef30 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
2ef40 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a  ells );.      sz
2ef50 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2ef60 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
2ef70 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31  &aSpace1[iSpace1
2ef80 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31  ];.      iSpace1
2ef90 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
2efa0 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70  sert( sz<=pBt->p
2efb0 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20  ageSize/4 );.   
2efc0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
2efd0 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
2efe0 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
2eff0 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
2f000 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
2f010 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
2f020 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
2f030 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
2f040 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2f050 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
2f060 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
2f070 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2f080 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
2f090 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
2f0a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
2f0b0 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
2f0c0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2f0d0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
2f0e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f0f0 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
2f100 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
2f110 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
2f120 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
2f130 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
2f140 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
2f150 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
2f160 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2f170 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
2f180 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
2f190 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
2f1a0 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
2f1b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
2f1c0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2f1d0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
2f1e0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
2f1f0 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
2f200 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
2f210 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
2f220 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
2f230 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
2f240 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2f250 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2f260 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
2f270 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
2f280 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
2f290 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
2f2a0 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
2f2b0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
2f2c0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
2f2d0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
2f2e0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
2f2f0 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
2f300 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
2f310 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
2f320 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
2f330 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
2f340 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2f350 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
2f360 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
2f370 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
2f380 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
2f390 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
2f3a0 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
2f3b0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
2f3c0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
2f3d0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
2f3e0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
2f3f0 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
2f400 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2f410 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
2f420 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
2f430 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
2f440 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
2f450 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
2f460 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
2f470 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
2f480 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
2f490 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
2f4a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2f4b0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
2f4c0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
2f4d0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
2f4e0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
2f4f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2f500 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
2f510 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
2f520 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
2f530 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
2f540 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
2f550 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
2f560 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
2f570 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
2f580 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
2f590 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2f5a0 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
2f5b0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
2f5c0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
2f5d0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
2f5e0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
2f5f0 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
2f600 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
2f610 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
2f620 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
2f630 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
2f640 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
2f650 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
2f660 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
2f670 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f  LITE_CORRUPT; go
2f680 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2f690 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  up; }.    }.  }.
2f6a0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2f6b0 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
2f6c0 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
2f6d0 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
2f6e0 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
2f6f0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2f700 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
2f710 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
2f720 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
2f730 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
2f740 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
2f750 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
2f760 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
2f770 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
2f780 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
2f790 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
2f7a0 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
2f7b0 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
2f7c0 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
2f7d0 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
2f7e0 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
2f7f0 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
2f800 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
2f810 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
2f820 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
2f830 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
2f840 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
2f850 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
2f860 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
2f870 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
2f880 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
2f890 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
2f8a0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
2f8b0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
2f8c0 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
2f8d0 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
2f8e0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
2f8f0 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
2f900 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
2f910 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
2f920 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
2f930 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
2f940 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
2f950 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
2f960 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
2f970 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
2f980 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
2f990 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f9a0 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
2f9b0 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
2f9c0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f9e0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
2f9f0 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
2fa00 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
2fa10 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
2fa20 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
2fa30 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
2fa40 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
2fa50 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
2fa60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2fa70 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
2fa80 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
2fa90 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
2faa0 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
2fab0 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
2fac0 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
2fad0 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
2fae0 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
2faf0 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
2fb00 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
2fb10 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
2fb20 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
2fb30 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
2fb40 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
2fb50 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
2fb60 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
2fb70 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
2fb80 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
2fb90 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
2fba0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
2fbb0 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
2fbc0 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20  ) or pPage is.  
2fbd0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
2fbe0 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
2fbf0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
2fc00 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
2fc10 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
2fc20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
2fc30 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
2fc40 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
2fc50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
2fc60 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
2fc70 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
2fc80 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
2fc90 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45  ==0) );..  TRACE
2fca0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
2fcb0 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
2fcc0 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
2fcd0 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
2fce0 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
2fcf0 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
2fd00 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
2fd10 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
2fd20 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2fd30 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
2fd40 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
2fd50 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
2fd60 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
2fd70 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
2fd80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2fd90 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  RRUPT;.    goto 
2fda0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2fdb0 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
2fdc0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
2fdd0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
2fde0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2fdf0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
2fe00 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
2fe10 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
2fe20 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
2fe30 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
2fe40 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
2fe50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2fe60 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
2fe70 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
2fe80 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
2fe90 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2fea0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
2feb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2fec0 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
2fed0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2fee0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2fef0 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29   &pgno, pgno, 0)
2ff00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2ff10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2ff20 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
2ff30 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
2ff40 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20      nNew++;..   
2ff50 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f     /* Set the po
2ff60 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
2ff70 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c  for the new sibl
2ff80 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
2ff90 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2ffa0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  UUM ){.        r
2ffb0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2ffc0 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
2ffd0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2ffe0 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
2fff0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30010 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
30020 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
30030 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30040 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
30050 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
30060 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
30070 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
30080 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
30090 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
300a0 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
300b0 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
300c0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
300d0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
300e0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
300f0 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
30100 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
30110 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
30120 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
30130 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
30140 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
30150 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
30160 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
30170 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
30180 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
30190 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
301a0 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
301b0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
301c0 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
301d0 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
301e0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
301f0 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
30200 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
30210 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
30220 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
30230 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
30240 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
30250 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
30260 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
30270 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
30280 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
30290 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
302a0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
302b0 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
302c0 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
302d0 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
302e0 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
302f0 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
30300 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
30310 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
30320 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
30330 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
30340 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
30350 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e    int minV = apN
30360 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
30370 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
30380 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
30390 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
303a0 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e  f( apNew[j]->pgn
303b0 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  o<(unsigned)minV
303c0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
303d0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
303e0 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70  nV = apNew[j]->p
303f0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
30400 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
30410 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
30420 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
30430 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61  *pT;.      t = a
30440 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
30450 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
30460 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  i];.      apNew[
30470 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
30480 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
30490 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
304a0 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65    }.  TRACE(("ne
304b0 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
304c0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
304d0 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70  d(%d)\n",.    ap
304e0 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a  New[0]->pgno, sz
304f0 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
30500 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e  >=2 ? apNew[1]->
30510 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
30520 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
30530 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
30540 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apNew[2]->pgno :
30550 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
30560 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
30570 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b  nNew>=4 ? apNew[
30580 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  3]->pgno : 0, nN
30590 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
305a0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
305b0 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67  5 ? apNew[4]->pg
305c0 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  no : 0, nNew>=5 
305d0 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
305e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
305f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30600 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
30610 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34  bPage) );.  put4
30620 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e  byte(pRight, apN
30630 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f  ew[nNew-1]->pgno
30640 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
30650 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
30660 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
30670 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
30680 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
30690 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
306a0 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
306b0 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
306c0 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
306d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
306e0 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
306f0 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
30700 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
30710 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
30720 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
30730 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
30740 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72  Cells );.    zer
30750 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
30760 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65  Flags);.    asse
30770 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
30780 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
30790 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
307a0 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
307b0 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
307c0 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
307d0 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
307e0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
307f0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
30800 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77  ..    j = cntNew
30810 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  [i];..    /* If 
30820 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
30830 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
30840 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67   was not the rig
30850 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c  ht-most sibling,
30860 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61  .    ** insert a
30870 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
30880 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
30890 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ge..    */.    a
308a0 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20  ssert( i<nNew-1 
308b0 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  || j==nCell );. 
308c0 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29     if( j<nCell )
308d0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
308e0 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
308f0 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
30900 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
30910 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
30920 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
30930 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
30940 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
30950 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
30960 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
30970 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53  OvflSpace[iOvflS
30980 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  pace];.      if(
30990 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
309a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
309b0 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
309c0 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
309d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
309e0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
309f0 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
30a00 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
30a10 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
30a20 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
30a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
30a40 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
30a50 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
30a60 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
30a70 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
30a80 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
30a90 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
30aa0 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
30ab0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
30ac0 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
30ad0 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
30ae0 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
30af0 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
30b00 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
30b10 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
30b20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
30b30 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
30b40 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
30b50 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
30b60 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
30b70 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
30b80 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
30b90 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
30ba0 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
30bb0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
30bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30bd0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
30be0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
30bf0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
30c00 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
30c10 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
30c20 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
30c30 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
30c40 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
30c50 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
30c60 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
30c70 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
30c80 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
30c90 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
30ca0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
30cb0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
30cc0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
30cd0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
30ce0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
30cf0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
30d00 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
30d10 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
30d20 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
30d30 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
30d40 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
30d50 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
30d60 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
30d70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30d80 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
30d90 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
30da0 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
30db0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
30dc0 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
30dd0 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
30de0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
30df0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
30e00 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
30e10 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
30e20 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
30e30 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
30e40 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
30e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
30e60 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
30e70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
30e80 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
30e90 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
30ea0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
30eb0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
30ec0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30ed0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
30ee0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
30ef0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
30f00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
30f10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30f20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d  iOvflSpace<=pBt-
30f30 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
30f40 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
30f50 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
30f60 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
30f70 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  emp, pNew->pgno)
30f80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
30f90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
30fa0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
30fb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30fc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30fd0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
30fe0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
30ff0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
31000 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
31010 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
31020 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
31030 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
31040 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
31050 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
31060 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
31070 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
31080 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
31090 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
310a0 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
310b0 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
310c0 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
310d0 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f    }..  if( isRoo
310e0 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  t && pParent->nC
310f0 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ell==0 && pParen
31100 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70  t->hdrOffset<=ap
31110 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b  New[0]->nFree ){
31120 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
31130 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
31140 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  ree now contains
31150 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f   no cells. The o
31160 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nly sibling.    
31170 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72  ** page is the r
31180 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
31190 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74  e parent. Copy t
311a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
311b0 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20  he.    ** child 
311c0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
311d0 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67  rent, decreasing
311e0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69   the overall hei
311f0 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ght of the.    *
31200 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  * b-tree structu
31210 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20  re by one. This 
31220 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20  is described as 
31230 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61  the "balance-sha
31240 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73  llower".    ** s
31250 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20  ub-algorithm in 
31260 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69  some documentati
31270 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  on..    **.    *
31280 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
31290 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
312a0 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74  base, the call t
312b0 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  o copyNodeConten
312c0 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73  t() .    ** sets
312d0 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70   all pointer-map
312e0 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70   entries corresp
312f0 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  onding to databa
31300 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a  se image pages .
31310 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68      ** for which
31320 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
31330 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
31340 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
31350 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  copied..    **. 
31360 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
31370 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65   assert below ve
31380 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  rifies that the 
31390 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65  child page is de
313a0 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a  fragmented.    *
313b0 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61  * (it must be, a
313c0 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65  s it was just re
313d0 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e  constructed usin
313e0 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29  g assemblePage()
313f0 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  ). This.    ** i
31400 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74  s important if t
31410 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68  he parent page h
31420 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67  appens to be pag
31430 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
31440 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65  ase.    ** image
31450 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
31460 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20  ( nNew==1 );.   
31470 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30   assert( apNew[0
31480 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20  ]->nFree == .   
31490 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26       (get2byte(&
314a0 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b  apNew[0]->aData[
314b0 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65  5])-apNew[0]->ce
314c0 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30  llOffset-apNew[0
314d0 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20  ]->nCell*2) .   
314e0 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
314f0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 63 6f 70  TE_OK==(rc = cop
31500 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
31510 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 29 29  ew[0], pParent))
31520 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
31530 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d  reePage(apNew[0]
31540 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
31550 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
31560 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20  M ){.    /* Fix 
31570 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
31580 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
31590 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77  the cells that w
315a0 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f 75  ere shifted arou
315b0 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72  nd. .    ** Ther
315c0 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64 69  e are several di
315d0 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
315e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
315f0 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ries that need t
31600 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  o.    ** be deal
31610 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72  t with by this r
31620 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20  outine. Some of 
31630 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20  these have been 
31640 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74  set already, but
31650 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76  .    ** many hav
31660 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  e not. The follo
31670 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72  wing is a summar
31680 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y:.    **.    **
31690 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69 65     1) The entrie
316a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
316b0 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  h new sibling pa
316c0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
316d0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69  t.    **      si
316e0 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73  blings when this
316f0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
31700 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76 65  lled. These have
31710 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
31720 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
31730 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
31740 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
31750 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
31760 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d  re.    **      m
31770 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
31780 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65 65  -list - the free
31790 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73 20  Page() code has 
317a0 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a  taken care.    *
317b0 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e  *      of those.
317c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
317d0 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d   2) The pointer-
317e0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
317f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
31800 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20  first overflow. 
31810 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20     **      page 
31820 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  in any overflow 
31830 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e  chains used by n
31840 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ew divider cells
31850 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20  . These .    ** 
31860 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61       have also a
31870 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65  lready been take
31880 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68 65  n care of by the
31890 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f   insertCell() co
318a0 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
318b0 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
318c0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
318d0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
318e0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
318f0 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   of.    **      
31900 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  cells stored on 
31910 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
31920 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
31930 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
31940 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20  .    **   4) If 
31950 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
31960 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e  s are not intern
31970 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c  al intkey nodes,
31980 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a   then any.    **
31990 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
319a0 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ages used by the
319b0 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65  se cells may nee
319c0 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a  d to be updated.
319d0 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74      **      (int
319e0 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
319f0 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  es never contain
31a00 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65   pointers to ove
31a10 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20  rflow pages)..  
31a20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29    **.    **   5)
31a30 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
31a40 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
31a50 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70  aves, then the p
31a60 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
31a70 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
31a80 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
31a90 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
31aa0 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
31ab0 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f  d.    **      to
31ac0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
31ad0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73   **.    ** Cases
31ae0 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61   1 and 2 are dea
31af0 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79  lt with above by
31b00 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65   other code. The
31b10 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
31b20 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 61  ck deals with ca
31b30 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20  ses 3 and 4 and 
31b40 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68  the one after th
31b50 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63  at, case 5. Sinc
31b60 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  e.    ** setting
31b70 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65   a pointer map e
31b80 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74 69  ntry is a relati
31b90 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f  vely expensive o
31ba0 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20  peration, this. 
31bb0 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20     ** code only 
31bc0 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70  sets pointer map
31bd0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69   entries for chi
31be0 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
31bf0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
31c00 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d     ** actually m
31c10 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61 67  oved between pag
31c20 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  es.  */.    MemP
31c30 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
31c40 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67  w[0];.    MemPag
31c50 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
31c60 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76  [0];.    int nOv
31c70 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
31c80 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
31c90 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c  t iNextOld = pOl
31ca0 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72  d->nCell + nOver
31cb0 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f  flow;.    int iO
31cc0 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72  verflow = (nOver
31cd0 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76  flow ? pOld->aOv
31ce0 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b  fl[0].idx : -1);
31cf0 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20  .    j = 0;     
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d10 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
31d20 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67  nt 'old' sibling
31d30 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d   page */.    k =
31d40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d60 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27  /* Current 'new'
31d70 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
31d80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
31d90 6e 43 65 6c 6c 20 26 26 20 72 63 3d 3d 53 51 4c  nCell && rc==SQL
31da0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
31db0 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65      int isDivide
31dc0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  r = 0;.      whi
31dd0 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20  le( i==iNextOld 
31de0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
31df0 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
31e00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
31e10 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
31e20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20  cell on old.    
31e30 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
31e40 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69  age j. If the si
31e50 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
31e60 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
31e70 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
31e80 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
31e90 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69  ell i was a divi
31ea0 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  der cell. */.   
31eb0 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f       pOld = apCo
31ec0 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20  py[++j];.       
31ed0 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20   iNextOld = i + 
31ee0 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
31ef0 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e  ->nCell + pOld->
31f00 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
31f10 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
31f20 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
31f30 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20      nOverflow = 
31f40 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
31f50 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
31f60 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66  flow = i + !leaf
31f70 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76  Data + pOld->aOv
31f80 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20  fl[0].idx;.     
31f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44     }.        isD
31fa0 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61  ivider = !leafDa
31fb0 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ta;  .      }.. 
31fc0 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
31fd0 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72  rflow>0 || iOver
31fe0 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20  flow<i );.      
31ff0 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
32000 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <2 || pOld->aOvf
32010 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[0].idx==pOld->
32020 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b  aOvfl[1].idx-1);
32030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
32040 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c  verflow<3 || pOl
32050 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d  d->aOvfl[1].idx=
32060 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e  =pOld->aOvfl[2].
32070 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  idx-1);.      if
32080 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29  ( i==iOverflow )
32090 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  {.        isDivi
320a0 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
320b0 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f   if( (--nOverflo
320c0 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w)>0 ){.        
320d0 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20    iOverflow++;. 
320e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
320f0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63  ..      if( i==c
32100 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20  ntNew[k] ){.    
32110 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
32120 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
32130 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
32140 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
32150 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
32160 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20  sibling page k. 
32170 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
32180 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
32190 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
321a0 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
321b0 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69  e, then cell i i
321c0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
321d0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
321e0 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b  ew = apNew[++k];
321f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
32200 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75  afData ) continu
32210 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
32220 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32230 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
32240 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29  assert( j<nOld )
32250 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32260 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20  k<nNew );..     
32270 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
32280 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64  was originally d
32290 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64  ivider cell (and
322a0 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a   is not now) or.
322b0 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72        ** an over
322c0 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66  flow cell, or if
322d0 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f   the cell was lo
322e0 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65  cated on a diffe
322f0 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20  rent sibling.   
32300 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72     ** page befor
32310 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  e the balancing,
32320 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
32330 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73  r map entries as
32340 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a  sociated.      *
32350 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64  * with any child
32360 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
32370 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  es need to be up
32380 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  dated.  */.     
32390 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20 7c   if( isDivider |
323a0 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e  | pOld->pgno!=pN
323b0 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ew->pgno ){.    
323c0 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
323d0 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
323e0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
323f0 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
32400 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
32410 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
32420 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
32430 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
32440 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d  zCell[i]>pNew->m
32450 69 6e 4c 6f 63 61 6c 20 26 26 20 72 63 3d 3d 53  inLocal && rc==S
32460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32470 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
32480 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
32490 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
324a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
324b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
324c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
324d0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
324e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
324f0 26 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  & i<nNew; i++){.
32500 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
32510 6d 61 70 50 75 74 28 0a 09 20 20 20 20 70 42 74  mapPut(..    pBt
32520 2c 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65  , get4byte(&apNe
32530 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  w[i]->aData[8]),
32540 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61   PTRMAP_BTREE, a
32550 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 29 3b 0a  pNew[i]->pgno);.
32560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
32570 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20  if 0.    /* The 
32580 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32590 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65  () contains asse
325a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
325b0 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74  that verify that
325c0 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e  .    ** all poin
325d0 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72  ter map pages ar
325e0 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  e set correctly.
325f0 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c   This is helpful
32600 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64   while .    ** d
32610 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69  ebugging. This i
32620 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c  s usually disabl
32630 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72  ed because a cor
32640 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61  rupt database ma
32650 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61  y.    ** cause a
32660 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
32670 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a  ment to fail.  *
32680 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  /.    ptrmapChec
32690 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e  kPages(apNew, nN
326a0 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43  ew);.    ptrmapC
326b0 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65  heckPages(&pPare
326c0 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  nt, 1);.#endif. 
326d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
326e0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
326f0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
32700 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c  CE: finished: ol
32710 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
32720 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
32730 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e     nOld, nNew, n
32740 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Cell));..  /*.  
32750 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
32760 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
32770 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
32780 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  p:.  sqlite3Scra
32790 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
327a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
327b0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
327c0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
327d0 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
327e0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
327f0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
32800 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
32810 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
32820 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
32830 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
32840 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70   when the root p
32850 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20  age of a b-tree 
32860 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20  structure is.** 
32870 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e  overfull (has on
32880 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
32890 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a  ow pages)..**.**
328a0 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   A new child pag
328b0 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  e is allocated a
328c0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
328d0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
328e0 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63  oot.** page, inc
328f0 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  luding overflow 
32900 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65  cells, are copie
32910 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  d into the child
32920 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  . The root.** pa
32930 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77  ge is then overw
32940 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69  ritten to make i
32950 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  t an empty page 
32960 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63  with the right-c
32970 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  hild .** pointer
32980 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
32990 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   new page..**.**
329a0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
329b0 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  g, all pointer-m
329c0 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
329d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
329e0 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  s .** that the n
329f0 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f  ew child-page no
32a00 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  w contains point
32a10 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74  ers to are updat
32a20 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79  ed. The.** entry
32a30 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
32a40 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  o the new right-
32a50 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
32a60 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
32a70 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  e is also update
32a80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
32a90 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64  essful, *ppChild
32aa0 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61   is set to conta
32ab0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
32ac0 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20  o the child .** 
32ad0 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  page and SQLITE_
32ae0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
32af0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32b00 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69   caller is requi
32b10 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72  red.** to call r
32b20 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20  eleasePage() on 
32b30 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79  *ppChild exactly
32b40 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72   once. If an err
32b50 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e  or occurs,.** an
32b60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
32b70 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43  eturned and *ppC
32b80 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30  hild is set to 0
32b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32ba0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
32bb0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d  emPage *pRoot, M
32bc0 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64  emPage **ppChild
32bd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
32c00 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
32c10 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
32c20 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b  age *pChild = 0;
32c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
32c40 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
32c50 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
32c60 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32c80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
32c90 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
32ca0 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
32cb0 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70   *pBt = pRoot->p
32cc0 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54  Bt;    /* The BT
32cd0 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ree */..  assert
32ce0 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  ( pRoot->nOverfl
32cf0 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ow>0 );.  assert
32d00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
32d10 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
32d20 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70   );..  /* Make p
32d30 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70  Root, the root p
32d40 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
32d50 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c  e, writable. All
32d60 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a  ocate a new .  *
32d70 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  * page that will
32d80 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
32d90 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
32da0 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63  Page. Copy the c
32db0 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
32dc0 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  the node stored 
32dd0 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68  on pRoot into th
32de0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
32df0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
32e00 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
32e10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32e20 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 29  pRoot->pDbPage))
32e30 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
32e40 21 3d 28 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  !=(rc = allocate
32e50 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70  BtreePage(pBt,&p
32e60 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64  Child,&pgnoChild
32e70 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 29  ,pRoot->pgno,0))
32e80 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
32e90 21 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65  !=(rc = copyNode
32ea0 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70  Content(pRoot, p
32eb0 43 68 69 6c 64 29 29 0a 20 20 20 7c 7c 20 28 49  Child)).   || (I
32ec0 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 0a  SAUTOVACUUM && .
32ed0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
32ee0 21 3d 28 72 63 20 3d 20 70 74 72 6d 61 70 50 75  !=(rc = ptrmapPu
32ef0 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  t(pBt, pgnoChild
32f00 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
32f10 70 52 6f 6f 74 2d 3e 70 67 6e 6f 29 29 29 0a 20  pRoot->pgno))). 
32f20 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64   ){.    *ppChild
32f30 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
32f40 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
32f50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32f60 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
32f70 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32f80 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
32f90 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
32fa0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
32fb0 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
32fc0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
32fd0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
32fe0 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65  Cell==pRoot->nCe
32ff0 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  ll );..  TRACE((
33000 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
33010 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
33020 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  ", pRoot->pgno, 
33030 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
33040 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f  .  /* Copy the o
33050 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72  verflow cells fr
33060 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69  om pRoot to pChi
33070 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  ld */.  memcpy(p
33080 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52  Child->aOvfl, pR
33090 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  oot->aOvfl, pRoo
330a0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  t->nOverflow*siz
330b0 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  eof(pRoot->aOvfl
330c0 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
330d0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f  >nOverflow = pRo
330e0 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a  ot->nOverflow;..
330f0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f    /* Zero the co
33100 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e  ntents of pRoot.
33110 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43   Then install pC
33120 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68  hild as the righ
33130 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65  t-child. */.  ze
33140 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43  roPage(pRoot, pC
33150 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
33160 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
33170 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  ut4byte(&pRoot->
33180 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
33190 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
331a0 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69  hild);..  *ppChi
331b0 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72  ld = pChild;.  r
331c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
331d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
331e0 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
331f0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
33200 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
33210 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
33220 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
33230 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
33240 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
33250 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
33260 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
33270 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
33280 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
33290 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
332a0 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
332b0 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20  tine. Balancing 
332c0 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a  routines are:.**
332d0 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75  .**   balance_qu
332e0 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  ick().**   balan
332f0 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20  ce_deeper().**  
33300 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
33310 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ().*/.static int
33320 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f   balance(BtCurso
33330 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
33340 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33350 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e    const int nMin
33360 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73   = pCur->pBt->us
33370 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33  ableSize * 2 / 3
33380 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51  ;.  u8 aBalanceQ
33390 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20  uickSpace[13];. 
333a0 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
333b0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
333c0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63   balance_quick_c
333d0 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54  alled = 0 );.  T
333e0 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
333f0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
33400 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20  ed = 0 );..  do 
33410 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
33420 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
33430 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
33440 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
33450 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66  [iPage];..    if
33460 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( iPage==0 ){.  
33470 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
33480 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
33490 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
334a0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
334b0 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ee is overfull. 
334c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c  In this case cal
334d0 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  l the.        **
334e0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
334f0 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72  ) function to cr
33500 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
33510 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
33520 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  ge.        ** an
33530 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72 65  d copy the curre
33540 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
33550 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  he root-page to 
33560 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  it. The.        
33570 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  ** next iteratio
33580 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
33590 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
335a0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  e child page..  
335b0 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
335c0 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
335d0 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
335e0 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
335f0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
33600 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70 43  eeper(pPage, &pC
33610 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a  ur->apPage[1]);.
33620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
33630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33640 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61         pCur->iPa
33650 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ge = 1;.        
33660 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
33670 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
33680 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d  pCur->aiIdx[1] =
33690 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
336a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
336b0 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[1]->nOverflow
336c0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
336d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
336e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
336f0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
33700 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
33710 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
33720 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20  ree<=nMin ){.   
33730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
33740 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  lse{.      MemPa
33750 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65  ge * const pPare
33760 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  nt = pCur->apPag
33770 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20  e[iPage-1];.    
33780 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78    int const iIdx
33790 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
337a0 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20  Page-1];..      
337b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
337c0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
337d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
337e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
337f0 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
33800 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
33810 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
33820 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
33830 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
33840 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
33850 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
33860 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
33870 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
33880 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
33890 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
338a0 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
338b0 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
338c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
338d0 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
338e0 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
338f0 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
33900 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
33910 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
33920 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
33930 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
33940 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
33950 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
33960 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
33970 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
33980 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
33990 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
339a0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
339b0 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
339c0 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
339d0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
339e0 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
339f0 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
33a00 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
33a10 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
33a20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
33a30 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
33a40 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
33a50 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
33a60 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
33a70 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
33a80 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
33a90 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
33aa0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
33ab0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
33ac0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
33ad0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
33ae0 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
33af0 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
33b00 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
33b10 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
33b20 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
33b30 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
33b40 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
33b50 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
33b60 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
33b70 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
33b80 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
33b90 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
33ba0 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
33bb0 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
33bc0 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
33bd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
33be0 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
33bf0 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
33c00 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
33c10 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
33c20 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
33c30 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
33c40 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
33c50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
33c60 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
33c70 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
33c80 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
33c90 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
33ca0 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
33cb0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
33cc0 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
33cd0 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
33ce0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
33cf0 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
33d00 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
33d10 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
33d20 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
33d30 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
33d40 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
33d50 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
33d60 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
33d70 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
33d80 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
33d90 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
33da0 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
33db0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
33dc0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
33dd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
33de0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
33df0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
33e00 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
33e10 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
33e20 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
33e30 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
33e40 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
33e50 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
33e60 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
33e70 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
33e80 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
33e90 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
33ea0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
33eb0 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
33ec0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
33ed0 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
33ee0 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
33ef0 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
33f00 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
33f10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
33f20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
33f30 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
33f40 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
33f50 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
33f60 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
33f70 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
33f80 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
33f90 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
33fa0 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
33fb0 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
33fc0 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
33fd0 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
33fe0 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
33ff0 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
34000 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
34010 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
34020 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
34030 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
34040 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
34050 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
34060 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
34070 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
34080 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
34090 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
340a0 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
340b0 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
340c0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
340d0 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
340e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
340f0 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
34100 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
34110 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
34120 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
34130 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34140 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
34150 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31  pSpace, iPage==1
34160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
34170 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
34180 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65        /* If pFre
34190 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
341a0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
341b0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
341c0 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed .            
341d0 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73  ** by a previous
341e0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
341f0 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20  _nonroot(). Its 
34200 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20  contents are.   
34210 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20           ** now 
34220 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e  stored either on
34230 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70   real database p
34240 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74  ages or within t
34250 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
34260 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75  ** new pSpace bu
34270 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20  ffer, so it may 
34280 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20  be safely freed 
34290 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
342a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
342b0 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
342c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
342d0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63      /* The pSpac
342e0 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  e buffer will be
342f0 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65   freed after the
34300 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20   next call to.  
34310 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
34320 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72  ce_nonroot(), or
34330 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69   just before thi
34340 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
34350 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20  ns, whichever.  
34360 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73          ** comes
34370 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20   first. */.     
34380 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70       pFree = pSp
34390 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ace;.        }. 
343a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
343b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
343c0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
343d0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
343e0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
343f0 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
34400 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
34410 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34420 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
34430 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
34440 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
34450 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
34460 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
34470 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
34480 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
34490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
344a0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
344b0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
344c0 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
344d0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
344e0 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
344f0 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
34500 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
34510 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
34520 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
34530 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
34540 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
34550 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
34560 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
34570 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
34580 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
34590 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
345a0 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
345b0 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
345c0 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
345d0 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
345e0 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
345f0 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
34600 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
34610 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
34620 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
34630 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
34640 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
34650 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
34660 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73  o, then a succes
34670 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  sful call to.** 
34680 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
34690 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
346a0 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
346b0 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
346c0 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
346d0 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
346e0 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
346f0 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20  ult returned (a 
34700 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62  negative.** numb
34710 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  er if pCur point
34720 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  s at an entry th
34730 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
34740 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c  an (pKey, nKey),
34750 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76   or.** a positiv
34760 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20  e value if pCur 
34770 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72  points at an etr
34780 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  y that is larger
34790 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c   than .** (pKey,
347a0 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20   nKey)). .**.** 
347b0 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
347c0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  t parameter is 0
347d0 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43  , then cursor pC
347e0 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ur may point to 
347f0 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72  any .** entry or
34800 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20   to no entry at 
34810 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  all. In this cas
34820 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
34830 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
34840 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
34850 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
34860 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
34870 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34880 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
34890 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
348a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
348b0 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
348c0 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
348d0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
348e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
348f0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
34900 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
34910 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
34920 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
34930 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
34940 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
34950 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
34960 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
34970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34980 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
34990 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
349a0 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
349b0 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
349c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
349d0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
349e0 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
349f0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
34a00 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
34a10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
34a20 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f   of prior Moveto
34a30 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20  Unpacked() call 
34a40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
34a50 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
34a60 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73 7a  Result;.  int sz
34a70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
34a80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34a90 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
34aa0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
34ab0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
34ac0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
34ad0 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
34ae0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34af0 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
34b00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
34b10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
34b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
34b30 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
34b40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
34b50 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
34b60 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
34b70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
34b80 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
34b90 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
34ba0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
34bb0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
34bc0 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
34bd0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
34be0 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20  is is an insert 
34bf0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
34c00 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  ree, invalidate 
34c10 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20  any incrblob .  
34c20 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
34c30 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  on the row being
34c40 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d   replaced (assum
34c50 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65  ing this is a re
34c60 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61  place.  ** opera
34c70 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20  tion - if it is 
34c80 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  not, the followi
34c90 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20  ng is a no-op). 
34ca0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
34cb0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
34cc0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
34cd0 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
34ce0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
34cf0 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
34d00 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
34d10 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
34d20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
34d30 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20  ur->skip;.  }.. 
34d40 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
34d50 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
34d60 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
34d70 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
34d80 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
34d90 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
34da0 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f  l to btreeMoveto
34db0 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f  () below is a no
34dc0 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78  -op. For.  ** ex
34dd0 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65  ample, when inse
34de0 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20  rting data into 
34df0 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74  a table with aut
34e00 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65  o-generated inte
34e10 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74  ger.  ** keys, t
34e20 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e  he VDBE layer in
34e30 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72  vokes sqlite3Btr
34e40 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75  eeLast() to figu
34e50 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a  re out the .  **
34e60 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20   integer key to 
34e70 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c  use. It then cal
34e80 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
34e90 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73   to actually ins
34ea0 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ert the .  ** da
34eb0 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b  ta into the intk
34ec0 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  ey B-Tree. In th
34ed0 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76  is case btreeMov
34ee0 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
34ef0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
34f00 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
34f10 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
34f20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
34f30 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
34f40 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
34f50 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
34f60 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
34f70 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
34f80 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
34f90 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
34fa0 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
34fb0 20 69 66 28 0a 20 20 20 20 53 51 4c 49 54 45 5f   if(.    SQLITE_
34fc0 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
34fd0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
34fe0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
34ff0 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26  ur)) || (!loc &&
35000 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
35010 28 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74  (rc = btreeMovet
35020 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
35030 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20  ey, appendBias, 
35040 26 6c 6f 63 29 29 0a 20 20 29 29 7b 0a 20 20 20  &loc)).  )){.   
35050 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35060 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
35070 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
35080 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65  ALID || (pCur->e
35090 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
350a0 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b  VALID && loc) );
350b0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
350c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
350d0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
350e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
350f0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
35100 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
35110 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
35120 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28  tKey );.  TRACE(
35130 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
35140 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
35150 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
35160 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
35170 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
35180 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
35190 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
351a0 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
351b0 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
351c0 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
351d0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
351e0 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
351f0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
35200 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
35210 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
35220 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
35230 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35240 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
35250 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
35260 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
35270 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
35280 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
35290 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
352a0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
352b0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
352c0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
352d0 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
352e0 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
352f0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
35300 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
35310 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
35320 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29  ;.  if( loc==0 )
35330 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
35340 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35350 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
35360 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35370 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
35380 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
35390 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
353a0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
353b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
353c0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
353d0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
353e0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
353f0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
35400 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
35410 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
35420 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
35430 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
35440 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
35450 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
35460 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  oldCell);.    if
35470 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
35480 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d  insert;.    rc =
35490 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
354a0 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20   idx, szOld);.  
354b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
354c0 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f  _OK ) {.      go
354d0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
354e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
354f0 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
35500 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
35510 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
35520 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  eaf );.    idx =
35530 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
35540 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
35550 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
35560 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
35570 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
35580 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
35590 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
355a0 77 2c 20 30 2c 20 30 29 3b 0a 20 20 61 73 73 65  w, 0, 0);.  asse
355b0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
355c0 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K || pPage->nCel
355d0 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  l>0 || pPage->nO
355e0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
355f0 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
35600 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70  as occured and p
35610 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72  Page has an over
35620 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20  flow cell, call 
35630 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20  balance() .  ** 
35640 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
35650 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  the cells within
35660 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65   the tree. Since
35670 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d   balance() may m
35680 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
35690 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74  sor, zero the Bt
356a0 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a  Cursor.info.nSiz
356b0 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76  e and BtCursor.v
356c0 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61  alidNKey.  ** va
356d0 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20  riables..  **.  
356e0 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
356f0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
35700 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74  alled moveToRoot
35710 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63  () to move the c
35720 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20  ursor.  ** back 
35730 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
35740 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73   as balance() us
35750 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ed to invalidate
35760 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
35770 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61  ** of BtCursor.a
35780 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75  pPage[] and BtCu
35790 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e  rsor.aiIdx[]. In
357a0 73 74 65 61 64 20 6f 66 20 64 6f 69 6e 67 20 74  stead of doing t
357b0 68 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  hat,.  ** set th
357c0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
357d0 6f 20 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69  o "invalid". Thi
357e0 73 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69  s makes common i
357f0 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
35800 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66  .  ** slightly f
35810 61 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  aster..  **.  **
35820 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62 74   There is a subt
35830 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74  le but important
35840 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65   optimization he
35850 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73  re too. When ins
35860 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74  erting.  ** mult
35870 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74  iple records int
35880 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72  o an intkey b-tr
35890 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ee using a singl
358a0 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e  e cursor (as can
358b0 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69  .  ** happen whi
358c0 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  le processing an
358d0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e   "INSERT INTO ..
358e0 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d  . SELECT" statem
358f0 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73  ent), it.  ** is
35900 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f   advantageous to
35910 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f   leave the curso
35920 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
35930 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a  e last entry in.
35940 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
35950 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20  if possible. If 
35960 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
35970 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
35980 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74  he last.  ** ent
35990 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ry in the table,
359a0 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f   and the next ro
359b0 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20 61  w inserted has a
359c0 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20  n integer key.  
359d0 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ** larger than t
359e0 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
359f0 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70  ing key, it is p
35a00 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72  ossible to inser
35a10 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77  t the.  ** row w
35a20 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74  ithout seeking t
35a30 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20  he cursor. This 
35a40 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65 72  can be a big per
35a50 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
35a60 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66    */.  pCur->inf
35a70 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
35a80 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
35a90 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
35aa0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
35ab0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
35ac0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
35ad0 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  pCur);..    /* M
35ae0 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
35af0 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
35b00 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
35b10 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
35b20 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74     ** fails. Int
35b30 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
35b40 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ture corruption 
35b50 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65  will result othe
35b60 72 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20 41  rwise. .    ** A
35b70 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75 72  lso, set the cur
35b80 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e 76  sor state to inv
35b90 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70 73  alid. This stops
35ba0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
35bb0 69 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72 6f  ion().    ** fro
35bc0 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  m trying to save
35bd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
35be0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72  ition of the cur
35bf0 73 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43 75  sor.  */.    pCu
35c00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
35c10 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
35c20 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  w = 0;.    pCur-
35c30 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
35c40 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
35c50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
35c60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
35c70 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  ]->nOverflow==0 
35c80 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a  );..end_insert:.
35c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35ca0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
35cb0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
35cc0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
35cd0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
35ce0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
35cf0 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69  inting at a arbi
35d00 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  trary location..
35d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
35d20 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
35d30 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
35d40 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
35d50 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
35d60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
35d70 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
35d80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
35d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35da0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
35db0 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ode */.  MemPage
35dc0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35de0 20 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20   Page to delete 
35df0 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  cell from */.  u
35e00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
35e10 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
35e20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
35e30 6f 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  o cell to delete
35e40 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49   */.  int iCellI
35e50 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
35e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35e70 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64  dex of cell to d
35e80 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
35e90 43 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20  CellDepth;      
35ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35eb0 2f 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65  /* Depth of node
35ec0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c   containing pCel
35ed0 6c 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28  l */ ..  assert(
35ee0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
35ef0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
35f00 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
35f10 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
35f20 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
35f30 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
35f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
35f50 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
35f60 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
35f70 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
35f80 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
35f90 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
35fa0 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61 73  o!=0, 2) );.  as
35fb0 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
35fc0 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d  nflicts(p, pCur-
35fd0 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20  >pgnoRoot) );.. 
35fe0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
35ff0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
36000 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
36010 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
36020 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45  nCell) .   || NE
36030 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
36040 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  !=CURSOR_VALID).
36050 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
36060 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
36070 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
36080 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20  gone awry. */.  
36090 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
360a0 69 73 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72  is a delete oper
360b0 61 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65 20  ation to remove 
360c0 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 74 61 62  a row from a tab
360d0 6c 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a 20  le b-tree,.  ** 
360e0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
360f0 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
36100 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
36110 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 20  being deleted.  
36120 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
36130 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
36140 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
36150 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70  blobCursors(p, p
36160 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
36170 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20  Cur->info.nKey, 
36180 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c  0);.  }..  iCell
36190 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50  Depth = pCur->iP
361a0 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20  age;.  iCellIdx 
361b0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43  = pCur->aiIdx[iC
361c0 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61  ellDepth];.  pPa
361d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
361e0 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  e[iCellDepth];. 
361f0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
36200 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
36210 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  x);..  /* If the
36220 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
36230 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65   the entry to de
36240 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
36250 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20  af page, move.  
36260 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ** the cursor to
36270 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
36280 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  ry in the tree t
36290 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  hat is smaller t
362a0 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74  han.  ** the ent
362b0 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ry being deleted
362c0 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c  . This cell will
362d0 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c   replace the cel
362e0 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a  l being deleted.
362f0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
36300 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65  ternal node. The
36310 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72   'previous' entr
36320 79 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68  y is used for th
36330 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20  is instead.  ** 
36340 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e  of the 'next' en
36350 74 72 79 2c 20 61 73 20 74 68 65 20 70 72 65 76  try, as the prev
36360 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c  ious entry is al
36370 77 61 79 73 20 61 20 70 61 72 74 20 6f 66 20 74  ways a part of t
36380 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65  he.  ** sub-tree
36390 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63   headed by the c
363a0 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65  hild page of the
363b0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
363c0 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a  ted. This makes.
363d0 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74    ** balancing t
363e0 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e  he tree followin
363f0 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65  g the delete ope
36400 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20  ration easier.  
36410 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
36420 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
36430 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 66   notUsed;.    if
36440 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
36450 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
36460 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e  revious(pCur, &n
36470 6f 74 55 73 65 64 29 29 20 29 7b 0a 20 20 20 20  otUsed)) ){.    
36480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36490 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76   }.  }..  /* Sav
364a0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
364b0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
364c0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
364d0 73 20 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20  s table before. 
364e0 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d   ** making any m
364f0 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61  odifications. Ma
36500 6b 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ke the page cont
36510 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79  aining the entry
36520 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c   to be .  ** del
36530 65 74 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54  eted writable. T
36540 68 65 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65  hen free any ove
36550 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
36560 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
36570 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20  .  ** entry and 
36580 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74  finally remove t
36590 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66  he cell itself f
365a0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  rom within the p
365b0 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53  age.  */.  if( S
365c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
365d0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
365e0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
365f0 6f 74 2c 20 70 43 75 72 29 29 0a 20 20 20 7c 7c  ot, pCur)).   ||
36600 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
36610 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36620 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
36630 67 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ge)).   || SQLIT
36640 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6c 65 61  E_OK!=(rc = clea
36650 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
36660 6c 6c 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ll)).   || SQLIT
36670 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70  E_OK!=(rc = drop
36680 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
36690 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  lIdx, cellSizePt
366a0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
366b0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
366c0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
366d0 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65  If the cell dele
366e0 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61  ted was not loca
366f0 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61  ted on a leaf pa
36700 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
36710 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72 72  sor.  ** is curr
36720 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
36730 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
36740 74 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d 74  try in the sub-t
36750 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a 20  ree headed.  ** 
36760 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61 67  by the child-pag
36770 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  e of the cell th
36780 61 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c 65  at was just dele
36790 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65  ted from an inte
367a0 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20  rnal.  ** node. 
367b0 54 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  The cell from th
367c0 65 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65 64  e leaf node need
367d0 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f  s to be moved to
367e0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
367f0 2a 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61  ** node to repla
36800 63 65 20 74 68 65 20 64 65 6c 65 74 65 64 20 63  ce the deleted c
36810 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ell.  */.  if( !
36820 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
36830 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61     MemPage *pLea
36840 66 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  f = pCur->apPage
36850 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
36860 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
36870 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d    Pgno n = pCur-
36880 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
36890 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  th+1]->pgno;.   
368a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
368b0 70 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c  pTmp;..    pCell
368c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
368d0 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d  f, pLeaf->nCell-
368e0 31 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  1);.    nCell = 
368f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61  cellSizePtr(pLea
36900 66 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61  f, pCell);.    a
36910 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
36920 49 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20  IZE(pBt)>=nCell 
36930 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65  );..    allocate
36940 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
36950 20 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e      pTmp = pBt->
36960 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20 20  pTmpSpace;..    
36970 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
36980 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36990 72 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70 44  rWrite(pLeaf->pD
369a0 62 50 61 67 65 29 29 20 0a 20 20 20 20 20 7c 7c  bPage)) .     ||
369b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
369c0 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
369d0 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70 43  ge, iCellIdx, pC
369e0 65 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20  ell-4, nCell+4, 
369f0 70 54 6d 70 2c 20 6e 29 29 0a 20 20 20 20 20 7c  pTmp, n)).     |
36a00 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
36a10 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61   = dropCell(pLea
36a20 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d  f, pLeaf->nCell-
36a30 31 2c 20 6e 43 65 6c 6c 29 29 0a 20 20 20 20 29  1, nCell)).    )
36a40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
36a50 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
36a60 2f 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 74  /* Balance the t
36a70 72 65 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72  ree. If the entr
36a80 79 20 64 65 6c 65 74 65 64 20 77 61 73 20 6c 6f  y deleted was lo
36a90 63 61 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  cated on a leaf 
36aa0 70 61 67 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  page,.  ** then 
36ab0 74 68 65 20 63 75 72 73 6f 72 20 73 74 69 6c 6c  the cursor still
36ac0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 61 74 20   points to that 
36ad0 70 61 67 65 2e 20 49 6e 20 74 68 69 73 20 63 61  page. In this ca
36ae0 73 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  se the first.  *
36af0 2a 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  * call to balanc
36b00 65 28 29 20 72 65 70 61 69 72 73 20 74 68 65 20  e() repairs the 
36b10 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 69 66  tree, and the if
36b20 28 2e 2e 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20  (...) condition 
36b30 69 73 0a 20 20 2a 2a 20 6e 65 76 65 72 20 74 72  is.  ** never tr
36b40 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74  ue..  **.  ** Ot
36b50 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
36b60 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61  entry deleted wa
36b70 73 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s on an internal
36b80 20 6e 6f 64 65 20 70 61 67 65 2c 20 74 68 65 6e   node page, then
36b90 0a 20 20 2a 2a 20 70 43 75 72 20 69 73 20 70 6f  .  ** pCur is po
36ba0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 65  inting to the le
36bb0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 77 68 69  af page from whi
36bc0 63 68 20 61 20 63 65 6c 6c 20 77 61 73 20 72 65  ch a cell was re
36bd0 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65  moved to.  ** re
36be0 70 6c 61 63 65 20 74 68 65 20 63 65 6c 6c 20 64  place the cell d
36bf0 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
36c00 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54  internal node. T
36c10 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a  his is slightly.
36c20 20 20 2a 2a 20 74 72 69 63 6b 79 20 61 73 20 74    ** tricky as t
36c30 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79  he leaf node may
36c40 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61   be underfull, a
36c50 6e 64 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  nd the internal 
36c60 6e 6f 64 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65  node may.  ** be
36c70 20 65 69 74 68 65 72 20 75 6e 64 65 72 20 6f 72   either under or
36c80 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
36c90 69 73 20 63 61 73 65 20 72 75 6e 20 74 68 65 20  is case run the 
36ca0 62 61 6c 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69  balancing algori
36cb0 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  thm.  ** on the 
36cc0 6c 65 61 66 20 6e 6f 64 65 20 66 69 72 73 74 2e  leaf node first.
36cd0 20 49 66 20 74 68 65 20 62 61 6c 61 6e 63 65 20   If the balance 
36ce0 70 72 6f 63 65 65 64 73 20 66 61 72 20 65 6e 6f  proceeds far eno
36cf0 75 67 68 20 75 70 20 74 68 65 0a 20 20 2a 2a 20  ugh up the.  ** 
36d00 74 72 65 65 20 74 68 61 74 20 77 65 20 63 61 6e  tree that we can
36d10 20 62 65 20 73 75 72 65 20 74 68 61 74 20 61 6e   be sure that an
36d20 79 20 70 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65  y problem in the
36d30 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68   internal node h
36d40 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72  as.  ** been cor
36d50 72 65 63 74 65 64 2c 20 73 6f 20 62 65 20 69 74  rected, so be it
36d60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 66 74  . Otherwise, aft
36d70 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  er balancing the
36d80 20 6c 65 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a   leaf node,.  **
36d90 20 77 61 6c 6b 20 74 68 65 20 63 75 72 73 6f 72   walk the cursor
36da0 20 75 70 20 74 68 65 20 74 72 65 65 20 74 6f 20   up the tree to 
36db0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
36dc0 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 69 74  e and balance it
36dd0 20 61 73 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20   as .  ** well. 
36de0 20 2a 2f 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e   */.  rc = balan
36df0 63 65 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ce(pCur);.  if( 
36e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36e10 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65   pCur->iPage>iCe
36e20 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20 20 20 77  llDepth ){.    w
36e30 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
36e40 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a  e>iCellDepth ){.
36e50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
36e60 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
36e70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
36e80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 62      }.    rc = b
36e90 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20  alance(pCur);.  
36ea0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
36eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
36ec0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
36ed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
36ef0 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
36f00 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
36f10 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
36f20 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
36f30 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
36f40 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
36f50 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
36f60 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
36f70 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
36f80 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
36f90 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
36fa0 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
36fb0 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
36fc0 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
36fd0 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
36fe0 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
36ff0 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
37000 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
37010 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
37020 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
37030 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
37040 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
37050 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
37060 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
37070 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
37080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
37090 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
370a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
370b0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
370c0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
370d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
370e0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
370f0 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
37100 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
37110 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
37120 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
37130 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
37140 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
37150 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
37160 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
37170 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
37180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37190 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
371a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
371b0 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
371c0 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
371d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
371e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
371f0 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
37200 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
37210 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
37220 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
37230 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
37240 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
37250 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
37260 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
37270 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
37280 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
37290 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67  .    /* Creating
372a0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79   a new table may
372b0 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72   probably requir
372c0 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73  e moving an exis
372d0 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20  ting database.  
372e0 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f    ** to make roo
372f0 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  m for the new ta
37300 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20  bles root page. 
37310 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67  In case this pag
37320 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f  e turns.    ** o
37330 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72  ut to be an over
37340 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74  flow page, delet
37350 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  e all overflow p
37360 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20  age-map caches. 
37370 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70     ** held by op
37380 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20  en cursors..    
37390 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  */.    invalidat
373a0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
373b0 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  e(pBt);..    /* 
373c0 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
373d0 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
373e0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
373f0 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
37400 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
37410 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
37420 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
37430 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
37440 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
37450 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
37460 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
37470 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
37480 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
37490 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
374a0 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 42  treeGetMeta(p, B
374b0 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
374c0 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f 52 6f 6f  T_PAGE, &pgnoRoo
374d0 74 29 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74  t);.    pgnoRoot
374e0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
374f0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
37500 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
37510 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
37520 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
37530 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
37540 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
37550 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e  /.    while( pgn
37560 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41  oRoot==PTRMAP_PA
37570 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f  GENO(pBt, pgnoRo
37580 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70  ot) ||.        p
37590 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47  gnoRoot==PENDING
375a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
375b0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  ){.      pgnoRoo
375c0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t++;.    }.    a
375d0 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e  ssert( pgnoRoot>
375e0 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  =3 );..    /* Al
375f0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54  locate a page. T
37600 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72  he page that cur
37610 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61  rently resides a
37620 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a  t pgnoRoot will.
37630 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20      ** be moved 
37640 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
37650 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68   page (unless th
37660 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
37670 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
37680 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e  to reside at pgn
37690 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20  oRoot)..    */. 
376a0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
376b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
376c0 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
376d0 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
376e0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
376f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37700 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37710 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
37720 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
37730 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f  ){.      /* pgno
37740 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65  Root is the page
37750 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
37760 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ed for the root-
37770 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  page of.      **
37780 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
37790 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f  assuming an erro
377a0 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29  r did not occur)
377b0 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20  . But we were.  
377c0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
377d0 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65   pgnoMove. If re
377e0 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20  quired (i.e. if 
377f0 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63  it was not alloc
37800 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ated.      ** by
37810 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66   extending the f
37820 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e  ile), the curren
37830 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69  t page at positi
37840 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20  on pgnoMove.    
37850 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
37860 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20  journaled..     
37870 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79   */.      u8 eTy
37880 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
37890 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
378a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
378b0 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f  eMove);..      /
378c0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
378d0 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e  currently at pgn
378e0 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76  oRoot to pgnoMov
378f0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
37900 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
37910 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
37920 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
37930 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37960 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
37970 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
37980 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
37990 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
379a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
379b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c  TRMAP_ROOTPAGE |
379c0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
379d0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
379e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
379f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
37a00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
37a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37a20 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37a30 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
37a40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
37a60 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
37a70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
37a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
37a90 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype!=PTRMAP_FREE
37aa0 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63  PAGE );.      rc
37ab0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
37ac0 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70  pBt, pRoot, eTyp
37ad0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e  e, iPtrPage, pgn
37ae0 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  oMove, 0);.     
37af0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
37b00 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ot);..      /* O
37b10 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61  btain the page a
37b20 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20  t pgnoRoot */.  
37b30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37b60 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
37b70 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
37b80 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
37b90 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
37ba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37bd0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
37be0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37bf0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
37c00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
37c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37c20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37c30 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
37c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37c50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
37c60 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
37c70 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
37c80 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
37c90 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
37ca0 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
37cb0 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
37cc0 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
37cd0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
37ce0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
37cf0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
37d00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
37d10 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
37d20 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
37d30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37d40 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
37d50 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
37d60 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f  eta(p, 4, pgnoRo
37d70 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ot);.    if( rc 
37d80 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
37d90 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
37da0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37db0 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
37dc0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
37dd0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
37de0 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
37df0 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
37e00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
37e10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
37e20 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
37e30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
37e40 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
37e50 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
37e60 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
37e70 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  AF);.  sqlite3Pa
37e80 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  gerUnref(pRoot->
37e90 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54  pDbPage);.  *piT
37ea0 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
37eb0 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
37ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
37ed0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
37ee0 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
37ef0 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
37f00 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
37f10 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
37f20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
37f30 72 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65  rc = btreeCreate
37f40 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65  Table(p, piTable
37f50 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  , flags);.  sqli
37f60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
37f70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37f80 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68  ../*.** Erase th
37f90 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
37fa0 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74   page and all it
37fb0 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74  s children.  Ret
37fc0 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  urn.** the page 
37fd0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
37fe0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
37ff0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
38000 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
38010 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
38020 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63  The BTree that c
38030 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c  ontains the tabl
38040 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
38050 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
38060 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  Page number to c
38070 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72  lear */.  int fr
38080 65 65 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20  eePageFlag,     
38090 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61  /* Deallocate pa
380a0 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ge if true */.  
380b0 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b  int *pnChange.){
380c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
380d0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  e = 0;.  int rc;
380e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
380f0 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pCell;.  int i
38100 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
38110 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
38120 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
38130 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
38140 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
38150 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38160 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
38170 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
38180 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
38190 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
381a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
381b0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
381c0 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30  e_out;.  for(i=0
381d0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
381e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c  ; i++){.    pCel
381f0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
38200 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ge, i);.    if( 
38210 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
38220 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72        rc = clear
38230 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
38240 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
38250 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b  ), 1, pnChange);
38260 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
38270 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
38280 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  sepage_out;.    
38290 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  }.    rc = clear
382a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
382b0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
382c0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
382d0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
382e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
382f0 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
38300 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
38310 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
38320 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d  &pPage->aData[8]
38330 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b  ), 1, pnChange);
38340 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
38350 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
38360 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73  page_out;.  }els
38370 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29  e if( pnChange )
38380 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
38390 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
383a0 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20     *pnChange += 
383b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
383c0 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65  }.  if( freePage
383d0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  Flag ){.    rc =
383e0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
383f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
38400 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38410 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
38420 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Page))==0 ){.   
38430 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
38440 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
38450 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
38460 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65  }..cleardatabase
38470 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  page_out:.  rele
38480 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
38490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
384a0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
384b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66