/ Hex Artifact Content
Login

Artifact a597d1d9608c88d6ce06f89c396fb560d244f2bc:


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 39 32 20 32 30 30 39 2f 30  c,v 1.692 2009/0
0190: 37 2f 32 30 20 31 37 3a 31 31 3a 35 30 20 64 72  7/20 17:11:50 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
07c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
07d0: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
07e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
07f0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0800: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0810: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0820: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0830: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0840: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
0850: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0860: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0870: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0880: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0890: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08a0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08b0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08c0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08d0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08e0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08f0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0900: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0910: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0920: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0930: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0940: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0950: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0960: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0970: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0980: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0990: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09a0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
09f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a00: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a10: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a30: 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69  Locks(a).  #defi
0a40: 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  ne downgradeAllS
0a50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0a60: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0a70: 65 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  e hasSharedCache
0a80: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c  TableLock(a,b,c,
0a90: 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68  d) 1.  #define h
0aa0: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
0ab0: 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a  a, b) 0.#endif..
0ac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ad0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0ae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0af0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
0b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0b10: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0b20: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0b30: 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68 65 63  atement. It chec
0b40: 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 6e 65  ks.** that conne
0b50: 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20 74 68  ction p holds th
0b60: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
0b70: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
0b80: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62 2d 74  e to the .** b-t
0b90: 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ree with root pa
0ba0: 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73 6f 2c  ge iRoot. If so,
0bb0: 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
0bc0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  d. Otherwise, fa
0bd0: 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65 78 61  lse. .** For exa
0be0: 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69  mple, when writi
0bf0: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 2d  ng to a table b-
0c00: 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  tree with root-p
0c10: 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a  age iRoot via .*
0c20: 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69  * Btree connecti
0c30: 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  on pBtree:.**.**
0c40: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 53      assert( hasS
0c50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0c60: 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  ock(pBtree, iRoo
0c70: 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b  t, 0, WRITE_LOCK
0c80: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ) );.**.** When 
0c90: 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  writing to an in
0ca0: 64 65 78 20 62 2d 74 72 65 65 20 74 68 61 74 20  dex b-tree that 
0cb0: 72 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61  resides in a sha
0cc0: 72 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20  rable database, 
0cd0: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  the .** caller s
0ce0: 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74  hould have first
0cf0: 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b   obtained a lock
0d00: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20   specifying the 
0d10: 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
0d20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
0d30: 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  g table b-tree. 
0d40: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d50: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d60: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d80: 74 73 20 65 61 63 68 20 62 2d 74 72 65 65 20 61  ts each b-tree a
0d90: 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72  s a separate str
0da0: 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72  ucture. To deter
0db0: 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  mine.** the tabl
0dc0: 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65 73 70  e b-tree corresp
0dd0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
0de0: 64 65 78 20 62 2d 74 72 65 65 20 62 65 69 6e 67  dex b-tree being
0df0: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
0e00: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
0e10: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
0e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
0e30: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
0e40: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
0e50: 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
0e60: 65 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74  ed at page iRoot
0e70: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
0e80: 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65  .** hold a write
0e90: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
0ea0: 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20  ema table (root 
0eb0: 70 61 67 65 20 31 29 2e 20 54 68 69 73 20 69 73  page 1). This is
0ec0: 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61   also.** accepta
0ed0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0ee0: 6e 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68  nt hasSharedCach
0ef0: 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74  eTableLock(.  Bt
0f00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
0f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
0f20: 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f  hat must hold lo
0f30: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ck */.  Pgno iRo
0f40: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot,            /
0f50: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62  * Root page of b
0f60: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
0f70: 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  sIndex,         
0f80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f    /* True if iRo
0f90: 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f  ot is the root o
0fa0: 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  f an index b-tre
0fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b  e */.  int eLock
0fc0: 54 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Type          /*
0fd0: 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74   Required lock t
0fe0: 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  ype (READ_LOCK o
0ff0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f  r WRITE_LOCK) */
1000: 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  .){.  Schema *pS
1010: 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20  chema = (Schema 
1020: 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  *)pBtree->pBt->p
1030: 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69  Schema;.  Pgno i
1040: 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  Tab = 0;.  BtLoc
1050: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  k *pLock;..  /* 
1060: 49 66 20 74 68 69 73 20 62 2d 74 72 65 65 20 64  If this b-tree d
1070: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73  atabase is not s
1080: 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20  hareable, or if 
1090: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
10a0: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68  ading.  ** and h
10b0: 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  as the read-unco
10c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
10d0: 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69  , then no lock i
10e0: 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a  s required. .  *
10f0: 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1100: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   return true imm
1110: 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20 74 68  ediately.  If th
1120: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1130: 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77 72 69  ing .  ** or wri
1140: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
1150: 74 72 65 65 2c 20 62 75 74 20 74 68 65 20 73 63  tree, but the sc
1160: 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f 61 64  hema is not load
1170: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ed, then return.
1180: 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f 2e 20    ** true also. 
1190: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11a0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
11b0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 74 6f 6f  d, but it is too
11c0: 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a 2a 20   difficult.  ** 
11d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
11e0: 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  client actually 
11f0: 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73 20 64  holds it. This d
1200: 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20 76 65  oesn't happen ve
1210: 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e 20 20  ry.  ** often.  
1220: 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65 65  */.  if( (pBtree
1230: 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a 20  ->sharable==0). 
1240: 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65 3d    || (eLockType=
1250: 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28 70  =READ_LOCK && (p
1260: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1270: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1280: 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20 20 7c  committed)).   |
1290: 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20 28 21  | (isIndex && (!
12a0: 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68  pSchema || (pSch
12b0: 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63  ema->flags&DB_Sc
12c0: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 29  hemaLoaded)==0 )
12d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
12e0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
12f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1300: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1310: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
1320: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
1330: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
1340: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
1350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1360: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
1370: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1380: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1390: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
13a0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
13b0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
13c0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
13d0: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
13e0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
13f0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1400: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1410: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
1420: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
1430: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
1440: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
1450: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
1460: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
1470: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 52  ( pIdx->tnum==iR
1480: 6f 6f 74 20 29 7b 0a 09 69 54 61 62 20 3d 20 70  oot ){..iTab = p
1490: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
14a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
14b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
14c0: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
14d0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
14e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
14f0: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
1500: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
1510: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
1520: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
1530: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
1540: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
1550: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1560: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1570: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1580: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1590: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
15a0: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
15b0: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
15c0: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
15d0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
15e0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
15f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1600: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1610: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1620: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1630: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1640: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1650: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1660: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1670: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
16a0: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
16b0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
16c0: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
16d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
16f0: 73 6f 20 75 73 65 64 20 61 73 20 70 61 72 74 20  so used as part 
1700: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
1710: 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20  ements only. It 
1720: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
1730: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  one or more curs
1750: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1760: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
1770: 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74  oot page iRoot t
1780: 68 61 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e  hat do not belon
1790: 67 20 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e  g to either conn
17a0: 65 63 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a  ection pBtree .*
17b0: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
17c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
17d0: 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63  has the read-unc
17e0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
17f0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  t..**.** For exa
1800: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1810: 74 69 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f  ting to page iRo
1820: 6f 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ot:.**.**    ass
1830: 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
1840: 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20 69  flicts(pBtree, i
1850: 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  Root) );.*/.stat
1860: 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f  ic int hasReadCo
1870: 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70  nflicts(Btree *p
1880: 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f  Btree, Pgno iRoo
1890: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  p;.  for(p=pBtre
18b0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
18e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20  Root==iRoot .   
18f0: 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d    && p->pBtree!=
1900: 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20 30  pBtree.     && 0
1910: 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62  ==(p->pBtree->db
1920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1930: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1940: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1950: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1970: 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69  .#endif    /* #i
1980: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1990: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  G */../*.** Quer
19a0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
19b0: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
19c0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19d0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
19e0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
19f0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
1a00: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1a10: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
1a20: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
1a30: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
1a40: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
1a50: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
1a60: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a70: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
1a80: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
1aa0: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ab0: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
1ac0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
1ad0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
1ae0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1af0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1b00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b10: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b20: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1b30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1b40: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1b50: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1b60: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
1b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 70  );.  assert( !(p
1b80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1b90: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1ba0: 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  ed)||eLock==WRIT
1bb0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
1bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
1bd0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
1be0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
1bf0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
1c00: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
1c10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1c20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
1c30: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
1c40: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
1c50: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
1c60: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
1c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c80: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
1c90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ca0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1cb0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
1cc0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
1cd0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
1ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1cf0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1d00: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d10: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d20: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
1d30: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1d40: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1d50: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1d60: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1d70: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
1d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
1da0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1db0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
1dc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1dd0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
1de0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
1df0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
1e00: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
1e10: 69 74 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e  iter!=p && pBt->
1e20: 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1e30: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1e40: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1e50: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
1e60: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
1e70: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1e80: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
1e90: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1ea0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1eb0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1ec0: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
1ed0: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
1ee0: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
1ef0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f00: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
1f20: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
1f30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1f40: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
1f50: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1f60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f70: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
1f80: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
1f90: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
1fa0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
1fb0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1fc0: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
1fd0: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
1fe0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
1ff0: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2000: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2010: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
2020: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
2030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2040: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
2060: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
2070: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2080: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2090: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
20a0: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
20b0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
20c0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
20d0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
20e0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
20f0: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2100: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2110: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
2120: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
2130: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
2140: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
2150: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2160: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
2170: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2180: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2190: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
21a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21c0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
21d0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
21e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2200: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2210: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2230: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2240: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2250: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2260: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2270: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
2280: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
2290: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
22a0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
22b0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
22c0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
22d0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
22e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22f0: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2300: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2310: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2320: 65 64 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  ed b-tree connec
2330: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 69 73 20 63  tion handle is c
2340: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68  onnected to a sh
2350: 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20  arable.**       
2360: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
2370: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
2380: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 29  Shared.sharable)
2390: 20 66 6c 61 67 20 73 65 74 2c 20 61 6e 64 0a 2a   flag set, and.*
23a0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
23b0: 68 65 72 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  her b-tree conne
23c0: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 68 6f 6c  ction handle hol
23d0: 64 73 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ds a lock that c
23e0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
23f0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
2400: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
2410: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2420: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2430: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2440: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2450: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2460: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2470: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2480: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2490: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
24a0: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
24b0: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
24c0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
24d0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
24f0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2500: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2510: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
2520: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2530: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2540: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2550: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2560: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2570: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2580: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2590: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
25b0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
25c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
25d0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
25e0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
25f0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
2600: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
2610: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
2620: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2630: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2640: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2650: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2660: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2670: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2680: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2690: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
26a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
26b0: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
26c0: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
26d0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
26e0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
26f0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2700: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2710: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2720: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2730: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2750: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2760: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2770: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2780: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2790: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
27a0: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
27b0: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
27c0: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
27d0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
27e0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
27f0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2800: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2810: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2820: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2830: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2840: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2850: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2860: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2870: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2880: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2890: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
28a0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
28b0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
28c0: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
28d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
28e0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
28f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2900: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2910: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2920: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2930: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2940: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2950: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2960: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2970: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2980: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2990: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
29a0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
29b0: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
29c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
29d0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
29e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
29f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2a10: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2a20: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2a30: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2a40: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2a50: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2a60: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2a70: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2a80: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2a90: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2aa0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2ab0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2ac0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ad0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2ae0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2af0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2b00: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2b10: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2b20: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2b30: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2b40: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2b50: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2b60: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2b70: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2b80: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2b90: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2ba0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2bb0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2bd0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2be0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2bf0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2c00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2c10: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2c20: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
2c30: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
2c40: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
2c50: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
2c60: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2c70: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
2c80: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
2c90: 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20  handle p..**.** 
2ca0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2cb0: 73 75 6d 65 73 20 74 68 61 74 20 68 61 6e 64 6c  sumes that handl
2cc0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2cd0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2ce0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2cf0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2d00: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2d10: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2d20: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2d30: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2d40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2d50: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2d60: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2d70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2d80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2d90: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2da0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2db0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2dc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2dd0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2de0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2df0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2e00: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2e10: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2e20: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2e30: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2e40: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2e50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2e60: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2e70: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2e80: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2e90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ea0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2eb0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2ec0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ed0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
2ee0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
2ef0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
2f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f10: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
2f20: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
2f30: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
2f40: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
2f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f60: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
2f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f80: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
2f90: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
2fb0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
2fc0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
2fd0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
2fe0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
2ff0: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3000: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3010: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3020: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3030: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3040: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3050: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3060: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3070: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3080: 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  when connection 
3090: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
30a0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
30b0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
30c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
30d0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
30e0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
30f0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3100: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3110: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3120: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3130: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3140: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
3150: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
3160: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
3170: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
3180: 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61  he isPending fla
3190: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
31a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
31b0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
31c0: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
31d0: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
31e0: 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  g must.    ** be
31f0: 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53   zero already. S
3200: 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65  o this next line
3210: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20   is harmless in 
3220: 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
3230: 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  /.    pBt->isPen
3240: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ding = 0;.  }.}.
3250: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3260: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3270: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3280: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d by connection 
3290: 70 20 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  p to read-locks.
32a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32b0: 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
32c0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
32d0: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
32e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32f0: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
3300: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3310: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3320: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  k;.    pBt->pWri
3330: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3340: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
3350: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
3360: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66  nding = 0;.    f
3370: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c  or(pLock=pBt->pL
3380: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
3390: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
33a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Lock->eLock==REA
33c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
33d0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20  >pBtree==p );.  
33e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
33f0: 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
3400: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69    }.  }.}..#endi
3410: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3420: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3430: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
3440: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
3450: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
3460: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3470: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
3480: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3490: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
34a0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
34b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
34c0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
34d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
34e0: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
34f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3500: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3510: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3520: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3530: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3540: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3550: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3560: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3570: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3580: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3590: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
35a0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
35b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
35c0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
35d0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
35e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
35f0: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3600: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3610: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3620: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3630: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3640: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3650: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3660: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3670: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3680: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3690: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
36a0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
36b0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
36c0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
36d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3700: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3710: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3720: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3730: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3740: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3760: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3770: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3780: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3790: 65 0a 2a 2a 20 62 2d 74 72 65 65 20 74 6f 20 69  e.** b-tree to i
37a0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
37b0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
37c0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
37d0: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
37e0: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
37f0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 41 72  ing modified. Ar
3800: 67 75 6d 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20  gument pgnoRoot 
3810: 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d  is the .** root-
3820: 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c  page of the tabl
3830: 65 20 62 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a  e b-tree. .**.**
3840: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3850: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3860: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3870: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3890: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
38a0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
38b0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
38c0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
38d0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
38e0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
38f0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3900: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3910: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3920: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3930: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3940: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3950: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3960: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3970: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3990: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
39a0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
39b0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
39c0: 68 69 73 20 73 70 65 63 69 66 69 63 20 72 6f 77  his specific row
39d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
39e0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
39f0: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
3a00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
3a10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
3a20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
3a30: 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
3a40: 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
3a50: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61   /* Look for rea
3a60: 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69  d cursors on thi
3a70: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 36 34  s btree */.  i64
3a80: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3aa0: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3ab0: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3ac0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ae0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3af0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3b00: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3b10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3b20: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3b30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b40: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3b50: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3b60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3b70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3b80: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3b90: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3ba0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3bb0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3bc0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3bd0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3be0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3bf0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3c00: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3c10: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3c20: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3c30: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3c40: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3c50: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3c60: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77  ncrblobCursors(w
3c70: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
3c80: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
3c90: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
3ca0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
3cb0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
3cc0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
3cd0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
3ce0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
3cf0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
3d00: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
3d10: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
3d20: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
3d30: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
3d40: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
3d50: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
3d60: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
3d70: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
3d80: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
3d90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
3da0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
3db0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3dc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
3dd0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
3de0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
3df0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
3e00: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
3e10: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
3e20: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
3e30: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
3e40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
3e50: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
3e60: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
3e70: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
3e80: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
3e90: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
3ea0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
3eb0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
3ec0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
3ed0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
3ee0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
3ef0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
3f00: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
3f10: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
3f20: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
3f30: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
3f40: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
3f50: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
3f60: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
3f70: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3f80: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
3f90: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
3fa0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
3fb0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
3fc0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
3fd0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
3fe0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
3ff0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4000: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4010: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4020: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4030: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4040: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4050: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4060: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4070: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4080: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4090: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
40a0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
40b0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
40c0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
40d0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
40e0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
40f0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4100: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4110: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4120: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4130: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4140: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4150: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4160: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4170: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4180: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4190: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
41a0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
41b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
41c0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
41d0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
41e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
41f0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4200: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4210: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4220: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4230: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4240: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4250: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4260: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4270: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4280: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4290: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
42a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
42b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
42c0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
42d0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
42e0: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
42f0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4300: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4310: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4320: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4330: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4340: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4350: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4360: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4380: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4390: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
43a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
43b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
43c0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
43d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
43e0: 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 31     int nPage = 1
43f0: 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  00;.    sqlite3P
4400: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
4410: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
4420: 65 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  e);.    /* If sq
4430: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
4440: 75 6e 74 28 29 20 66 61 69 6c 73 20 74 68 65 72  unt() fails ther
4450: 65 20 69 73 20 6e 6f 20 68 61 72 6d 20 62 65 63  e is no harm bec
4460: 61 75 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ause the.    ** 
4470: 6e 50 61 67 65 20 76 61 72 69 61 62 6c 65 20 69  nPage variable i
4480: 73 20 75 6e 63 68 61 6e 67 65 64 20 66 72 6f 6d  s unchanged from
4490: 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c   its default val
44a0: 75 65 20 6f 66 20 31 30 30 20 2a 2f 0a 20 20 20  ue of 100 */.   
44b0: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
44c0: 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
44d0: 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50 61  cCreate((u32)nPa
44e0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42  ge);.    if( !pB
44f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
4500: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
4510: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
4520: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4530: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f  QLITE_OK && pgno
4540: 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  <=sqlite3BitvecS
4550: 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ize(pBt->pHasCon
4560: 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20  tent) ){.    rc 
4570: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
4580: 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  et(pBt->pHasCont
4590: 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent, pgno);.  }.
45a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
45b0: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20  /*.** Query the 
45c0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
45d0: 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a  tent vector..**.
45e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
45f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4600: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4610: 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64   page is removed
4620: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65   from the.** fre
4630: 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65  e-list for reuse
4640: 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c  . It returns fal
4650: 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  se if it is safe
4660: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
4670: 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68  .** page from th
4680: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  e pager layer wi
4690: 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
46a0: 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72  nt' flag set. Tr
46b0: 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ue otherwise..*/
46c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
46d0: 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eGetHasContent(B
46e0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
46f0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76  no pgno){.  Bitv
4700: 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61  ec *p = pBt->pHa
4710: 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75  sContent;.  retu
4720: 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73  rn (p && (pgno>s
4730: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
4740: 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  (p) || sqlite3Bi
4750: 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f  tvecTest(p, pgno
4760: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  )));.}../*.** Cl
4770: 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68  ear (destroy) th
4780: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4790: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
47a0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  his should be.**
47b0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
47c0: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61  conclusion of ea
47d0: 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ch write-transac
47e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
47f0: 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48  void btreeClearH
4800: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4810: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
4820: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
4830: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4840: 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43  t);.  pBt->pHasC
4850: 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ontent = 0;.}../
4860: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4870: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4880: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4890: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
48a0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
48b0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
48c0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
48d0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
48e0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
48f0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
4900: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
4910: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4920: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4930: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
4940: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
4950: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
4960: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
4970: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
4980: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
4990: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
49a0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
49b0: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
49c0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
49d0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
49e0: 43 61 6e 6e 6f 74 20 66 61 69 6c 20 73 69 6e 63  Cannot fail sinc
49f0: 65 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  e pCur->eState==
4a00: 56 41 4c 49 44 20 2a 2f 0a 0a 20 20 2f 2a 20 49  VALID */..  /* I
4a10: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
4a20: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
4a30: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
4a40: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
4a50: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
4a60: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
4a70: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
4a80: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
4a90: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
4aa0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
4ab0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
4ac0: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
4ad0: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
4ae0: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
4af0: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
4b00: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
4b10: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
4b20: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
4b30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
4b40: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
4b50: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76  >intKey ){.    v
4b60: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
4b70: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
4b80: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
4b90: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
4ba0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4bb0: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
4bc0: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
4bd0: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
4be0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4bf0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
4c00: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
4c10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4c20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4c30: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
4c40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4c50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4c60: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4c70: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
4c80: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
4c90: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
4ca0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
4cb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4cc0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4cd0: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
4ce0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
4cf0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4d00: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4d10: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
4d20: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
4d30: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
4d40: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
4d50: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
4d60: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
4d70: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
4d80: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4d90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4da0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4db0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
4dc0: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
4dd0: 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e   pExcept open on
4de0: 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77   the table .** w
4df0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
4e00: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
4e10: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
4e20: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
4e30: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
4e40: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
4e50: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
4e60: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
4e70: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
4e80: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
4e90: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
4ea0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
4eb0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
4ec0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
4ed0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
4ee0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4ef0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4f00: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
4f10: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
4f20: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
4f30: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
4f40: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
4f50: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
4f60: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
4f70: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
4f80: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
4f90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
4fa0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
4fb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
4fc0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fd0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
4fe0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
4ff0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5000: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
5010: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5020: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5030: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
5040: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5050: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5060: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5070: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5080: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5090: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
50a0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
50b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
50c0: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
50d0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
50e0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
50f0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
5100: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
5110: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
5120: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
5130: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
5140: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5150: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5160: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5170: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5180: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5190: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
51a0: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
51b0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
51c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
51d0: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
51f0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
5200: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
5210: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
5220: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
5230: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
5240: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5250: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5260: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5270: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5280: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5290: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
52a0: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
52b0: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
52c0: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
52d0: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
52e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
52f0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
5300: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
5310: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
5320: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
5330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5340: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5350: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5360: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5370: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5380: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5390: 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20  e[150];         
53a0: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
53b0: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
53c0: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
53d0: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
53e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
53f0: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
5400: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
5410: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
5420: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
5430: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
5440: 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
5480: 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
5490: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
54a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
54b0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
54c0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
54d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
54e0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
54f0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
5500: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
5510: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
5520: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
5530: 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
5540: 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
5550: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5560: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
5570: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
5580: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
5590: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
55a0: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
55b0: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
55c0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
55d0: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
55e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
55f0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
5600: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
5610: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
5620: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
5630: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
5640: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
5650: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
5660: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5670: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
5680: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
5690: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
56a0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
56b0: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
56c0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
56d0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
56e0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
56f0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5700: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
5710: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5720: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
5730: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
5740: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5750: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
5760: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
5770: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
5780: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5790: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
57a0: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
57b0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
57c0: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
57d0: 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74   &pCur->skipNext
57e0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
57f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5800: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5810: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
5820: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
5830: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5840: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5850: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
5860: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
5870: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
5880: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
5890: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
58a0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
58b0: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
58c0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
58d0: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
58e0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
58f0: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
5900: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
5910: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
5920: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
5930: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
5940: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
5950: 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20  ition it.** was 
5960: 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20  last placed at. 
5970: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
5980: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
5990: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
59a0: 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65  .** at is delete
59b0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
59c0: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   them..**.** Thi
59d0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
59e0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  s an error code 
59f0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
5a00: 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a  s wrong.  The.**
5a10: 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f   integer *pHasMo
5a20: 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  ved is set to on
5a30: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
5a40: 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20  has moved and 0 
5a50: 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  if not..*/.int s
5a60: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
5a70: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
5a80: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
5a90: 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  HasMoved){.  int
5aa0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73   rc;..  rc = res
5ab0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5ac0: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
5ad0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  rc ){.    *pHasM
5ae0: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  oved = 1;.    re
5af0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
5b00: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
5b10: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b20: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
5b30: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  =0 ){.    *pHasM
5b40: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  oved = 1;.  }els
5b50: 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  e{.    *pHasMove
5b60: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
5b70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5b80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5b90: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5ba0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
5bb0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
5bc0: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
5bd0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
5be0: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
5bf0: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
5c00: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
5c10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
5c20: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
5c30: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
5c40: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
5c50: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
5c60: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5c70: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
5c80: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5c90: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
5ca0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
5cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5cc0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5cd0: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
5ce0: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
5cf0: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
5d00: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
5d10: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
5d20: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
5d30: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
5d40: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
5d50: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
5d60: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
5d70: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
5d80: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5d90: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5da0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
5db0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
5dc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
5dd0: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
5de0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
5df0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
5e00: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
5e10: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
5e20: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
5e30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
5e40: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
5e50: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
5e60: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
5e70: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
5e80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
5e90: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
5ea0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5eb0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
5ec0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
5ed0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
5ee0: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
5ef0: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
5f00: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5f10: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
5f20: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
5f30: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
5f40: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
5f50: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
5f60: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
5f70: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
5f80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
5f90: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
5fa0: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
5fb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
5fc0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
5fd0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
5fe0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
5ff0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6000: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6010: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6020: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
6030: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
6040: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
6050: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6060: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6070: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
6080: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
6090: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
60a0: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
60b0: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
60c0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
60d0: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
60e0: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
60f0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6100: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
6110: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
6120: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
6130: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6140: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6150: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
6160: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
6170: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
6180: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
6190: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
61a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
61b0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
61c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
61d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
61e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
61f0: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
6200: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6210: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6220: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
6230: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6240: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6250: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
6260: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
6270: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6280: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6290: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
62a0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
62b0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
62c0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
62d0: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
62e0: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
62f0: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
6300: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
6310: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
6320: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
6330: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
6340: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
6350: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
6360: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6370: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
6380: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
6390: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
63a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
63b0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
63c0: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
63d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
63e0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
63f0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
6400: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
6410: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6420: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6430: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
6440: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6450: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
6460: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
6470: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
6480: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
6490: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
64a0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
64b0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
64c0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
64d0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
64e0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
64f0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
6500: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
6510: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6520: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
6530: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
6540: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
6550: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
6560: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6570: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
6580: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6590: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
65a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
65b0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
65c0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
65d0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
65e0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
65f0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
6600: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
6610: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6620: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6630: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6640: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
6650: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6660: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6670: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6680: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6690: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
66a0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
66b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
66c0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
66d0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
66e0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
66f0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
6700: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6710: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6730: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6740: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6750: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6760: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6770: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6780: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6790: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
67a0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
67b0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
67c0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
67d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
67e0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
67f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
6800: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
6810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6820: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6830: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6840: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
6850: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
6860: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6870: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6880: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
6890: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
68a0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
68b0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
68c0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
68d0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
68e0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
68f0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
6900: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
6910: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
6920: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6930: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
6940: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6950: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
6960: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
6970: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
6980: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
6990: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
69a0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
69b0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
69c0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
69d0: 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29  (&(P)->aData[(P)
69e0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28  ->cellOffset+2*(
69f0: 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  I)])))../*.** Th
6a00: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
6a10: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
6a20: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
6a30: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
6a40: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
6a50: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
6a60: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
6a70: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
6a80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
6a90: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
6aa0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
6ab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6ac0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
6ad0: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
6ae0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
6af0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6b00: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
6b10: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
6b20: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
6b30: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
6b40: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
6b50: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
6b60: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
6b70: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
6b80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6b90: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
6ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
6bb0: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
6bc0: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
6bd0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
6be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
6bf0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
6c00: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
6c10: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
6c20: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
6c30: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
6c40: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
6c50: 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72  ction.  btreePar
6c60: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
6c70: 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20   .** cell index 
6c80: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6c90: 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65  gument and btree
6ca0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
6cb0: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
6cc0: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
6cd0: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
6ce0: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
6cf0: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
6d00: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
6d10: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
6d20: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
6d30: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72  nstead of.** btr
6d40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
6d50: 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d  . Using some com
6d60: 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c  pilers, this wil
6d70: 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  l be faster..*/.
6d80: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
6d90: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
6da0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6dc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6dd0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
6de0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
6df0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6e00: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
6e10: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
6e20: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
6e30: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
6e40: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31  cture */.){.  u1
6e50: 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 n;            
6e60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6e70: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
6e80: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
6e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
6ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
6ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
6ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6f00: 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43   );..  pInfo->pC
6f10: 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61  ell = pCell;.  a
6f20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
6f30: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
6f40: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d  leaf==1 );.  n =
6f50: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
6f60: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
6f70: 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65  n==4-4*pPage->le
6f80: 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  af );.  if( pPag
6f90: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
6fa0: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
6fb0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ata ){.      n +
6fc0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
6fd0: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
6fe0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
6ff0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
7000: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b  0;.    }.    n +
7010: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
7020: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[n], (u64*)&pI
7030: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  nfo->nKey);.    
7040: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
7050: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
7060: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  {.    pInfo->nDa
7070: 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d  ta = 0;.    n +=
7080: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
7090: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
70a0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
70b0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
70c0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
70d0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
70e0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
70f0: 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73  r = n;.  testcas
7100: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
7110: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7120: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
7130: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
7140: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7150: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
7160: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
7170: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
7180: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
7190: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
71a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
71b0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
71c0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
71d0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
71e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
71f0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
7200: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
7210: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
7220: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
7230: 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65  tes */.    nSize
7240: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
7250: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
7260: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
7270: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
7280: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7290: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
72a0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
72b0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
72c0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
72d0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
72e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
72f0: 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a  Size = (u16)nSiz
7300: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
7310: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
7320: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
7330: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
7340: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
7350: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
7360: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
7370: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
7380: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
7390: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
73a0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
73b0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
73c0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
73d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
73e0: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
73f0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
7400: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
7410: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
7420: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
7430: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
7440: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
7450: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
7460: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
7470: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
7480: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7490: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
74a0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
74b0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
74c0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
74d0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
74e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
74f0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
7500: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7510: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7520: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
7530: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
7540: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7550: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7560: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
7570: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
7580: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
7590: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
75a0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
75b0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
75c0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
75d0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
75e0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
75f0: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
7600: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
7610: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
7620: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7630: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
7640: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
7650: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
7660: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7670: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
7680: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
7690: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
76a0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
76b0: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
76c0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
76d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
76e0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
76f0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
7700: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7710: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
7720: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
7730: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
7740: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
7750: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
7760: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
7770: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
7780: 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  \.  btreeParseCe
7790: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
77a0: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
77b0: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
77c0: 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  o)).static void 
77d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
77e0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
77f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7800: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7810: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
7820: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7830: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
7840: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
7850: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
7860: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
7870: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
7880: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7890: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
78a0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
78b0: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
78c0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
78d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
78e0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
78f0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
7900: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
7910: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
7920: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
7930: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
7940: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
7950: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
7960: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
7970: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
7980: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
7990: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
79a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
79b0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
79c0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
79d0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
79e0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
79f0: 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e  = &pCell[pPage->
7a00: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
7a10: 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66   u32 nSize;..#if
7a20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
7a30: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
7a40: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
7a50: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7a60: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
7a70: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
7a80: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
7a90: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
7aa0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
7ab0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
7ac0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
7ad0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
7ae0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
7af0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
7b00: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
7b10: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
7b20: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
7b30: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
7b40: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
7b50: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
7b60: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
7b70: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
7b80: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
7b90: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7ba0: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
7bb0: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
7bc0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
7bd0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7be0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7bf0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
7c00: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
7c10: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7c20: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
7c30: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
7c40: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
7c50: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
7c60: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
7c70: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
7c80: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
7c90: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
7ca0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
7cb0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
7cc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
7cd0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
7ce0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
7cf0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
7d00: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
7d10: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
7d20: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
7d30: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7d40: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
7d50: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  }..  testcase( n
7d60: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7d70: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
7d80: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7da0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
7db0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
7dc0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7dd0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7de0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
7df0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
7e00: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
7e10: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7e20: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7e30: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7e40: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7e50: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
7e60: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7e70: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
7e80: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
7e90: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7ea0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
7eb0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7ec0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
7ed0: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
7ee0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
7ef0: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
7f00: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
7f10: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
7f20: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
7f30: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
7f40: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
7f50: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
7f60: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
7f70: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
7f80: 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ze;.}.#ifndef ND
7f90: 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20  EBUG.static u16 
7fa0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
7fb0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7fc0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
7fd0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7fe0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
7ff0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
8000: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
8010: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8020: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8030: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8040: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8050: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8060: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8070: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8080: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8090: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
80a0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
80b0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
80c0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
80d0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
80e0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
80f0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
8100: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
8110: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8120: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8130: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8140: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8150: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8160: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8170: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8180: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8190: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
81a0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
81b0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
81c0: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
81d0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
81e0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
81f0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
8200: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
8210: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
8220: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8230: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8240: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8250: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8260: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8270: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8280: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8290: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
82a0: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
82b0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
82c0: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
82d0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
82e0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
82f0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
8300: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
8310: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8320: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8330: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8340: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8350: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8380: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
83b0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
83c0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
83e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
83f0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
8400: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
8410: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8420: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8430: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8450: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8460: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8470: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8480: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8490: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
84a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
84b0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
84c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
84e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
84f0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
8500: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
8510: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8520: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8530: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8540: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8550: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8560: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8570: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8580: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8590: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
85a0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
85b0: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
85c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
85d0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
85e0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
85f0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
8600: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
8610: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
8620: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8630: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8640: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8650: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8660: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8670: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8680: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8690: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
86a0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
86b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
86c0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
86d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
86e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
86f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8700: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8710: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8720: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8730: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8740: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8750: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8760: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8770: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8780: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8790: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
87a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
87b0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
87c0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
87d0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
87e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
87f0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8800: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8810: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8820: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8830: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8840: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8850: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8860: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8870: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8880: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8890: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
88a0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
88b0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
88c0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
88d0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
88e0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
88f0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8900: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8910: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8920: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8930: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8940: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8950: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8960: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8980: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8990: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
89a0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
89b0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
89c0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
89d0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
89e0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
89f0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8a00: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8a10: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8a20: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8a30: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8a40: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8a60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8a70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8a80: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8a90: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8aa0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8ab0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8ac0: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ad0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8ae0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8af0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8b00: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8b10: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8b20: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8b30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8b40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8b50: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8b60: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8b70: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8b80: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8b90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ba0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8bb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8bc0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8bd0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8be0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8bf0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8c00: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8c10: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8c20: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
8c30: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8c40: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8c50: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8c60: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8c70: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8c80: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8c90: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
8ca0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
8cb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8cc0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
8cd0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
8ce0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
8cf0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
8d00: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
8d10: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
8d20: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
8d30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8d40: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8d50: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8d60: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
8d70: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
8d80: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
8d90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8da0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
8db0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8dc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
8dd0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
8de0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
8df0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
8e00: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
8e10: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
8e20: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
8e30: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
8e40: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
8e50: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
8e60: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
8e70: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
8e80: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
8e90: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
8ea0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
8eb0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
8ec0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
8ed0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
8ee0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
8ef0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
8f00: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
8f10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
8f20: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
8f30: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
8f40: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
8f50: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
8f60: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
8f70: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
8f80: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
8f90: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
8fa0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
8fb0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
8fc0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
8fd0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
8fe0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
8ff0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
9000: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
9010: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
9020: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9030: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9040: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9060: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9070: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9080: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9090: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
90a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
90b0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
90c0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
90d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
90e0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
90f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9100: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
9110: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9120: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9130: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9160: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9170: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9180: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
91b0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
91c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
91d0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
91e0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
91f0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
9200: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
9210: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
9220: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9230: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9240: 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  de */.  .  asser
9250: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9260: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9270: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9280: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9290: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
92a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
92b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
92c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
92d0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
92e0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
92f0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9300: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9310: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9320: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9330: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
9340: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9350: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9360: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9370: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9380: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9390: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
93a0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
93b0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
93c0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
93d0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
93e0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
93f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9400: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9410: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9420: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9430: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9440: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9450: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9460: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9470: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9480: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9490: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
94a0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
94b0: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
94c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
94d0: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
94e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
94f0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
9500: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
9510: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
9520: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
9530: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
9540: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9550: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9560: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9570: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9580: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9590: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
95a0: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
95b0: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
95c0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
95d0: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
95e0: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
95f0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
9600: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
9610: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9620: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
9630: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
9640: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9650: 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a  a[pc+2]);     /*
9660: 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c   Size of free sl
9670: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
9680: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
9690: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73         int x = s
96a0: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
96b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
96c0: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==4 );.        t
96d0: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
96e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34  .        if( x<4
96f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9700: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
9710: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
9720: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
9730: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
9740: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
9750: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
9760: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
9770: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
9780: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
9790: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
97a0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
97b0: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
97c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
97d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
97e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
97f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
9800: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
9810: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
9820: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
9830: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
9840: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
9850: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
9860: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
9870: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
9880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
9890: 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20  Idx = pc + x;.  
98a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
98b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
98c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
98d0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
98e0: 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  re there is enou
98f0: 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65 20  gh space in the 
9900: 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20  gap to satisfy. 
9910: 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   ** the allocati
9920: 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66  on.  If not, def
9930: 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  ragment..  */.  
9940: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
9950: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
9960: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
9970: 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  top ){.    rc = 
9980: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9990: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
99a0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
99b0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
99c0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
99d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
99e0: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
99f0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
9a00: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
9a10: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
9a20: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
9a30: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
9a40: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
9a50: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
9a60: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
9a70: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9a80: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a  dr+5], top);.  *
9a90: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
9aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9ac0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
9ad0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
9ae0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
9af0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
9b00: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
9b10: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
9b20: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
9b30: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
9b40: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
9b50: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
9b60: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
9b70: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
9b80: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
9b90: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
9ba0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
9bb0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
9bc0: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
9bd0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
9be0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9bf0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
9c00: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
9c10: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
9c20: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
9c50: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
9c60: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
9c70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9c80: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
9ca0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
9cb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9cc0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9cd0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9ce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
9cf0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
9d00: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
9d10: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
9d20: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
9d30: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
9d40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
9d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9d60: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9d70: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9d80: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
9d90: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
9da0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
9db0: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
9dc0: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
9dd0: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
9de0: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
9df0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
9e00: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
9e10: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
9e20: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
9e30: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
9e40: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
9e50: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
9e60: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
9e70: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
9e80: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
9e90: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
9ea0: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65  reeblocks.  Note
9eb0: 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20   that.  ** even 
9ec0: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
9ed0: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
9ee0: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
9ef0: 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62  itPage(),.  ** b
9f00: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64  treeInitPage() d
9f10: 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  id not detect ov
9f20: 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20  erlapping cells 
9f30: 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  or.  ** freebloc
9f40: 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70  ks that overlapp
9f50: 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20  ed cells.   Nor 
9f60: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77  does it detect w
9f70: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  hen the.  ** cel
9f80: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65  l content area e
9f90: 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65  xceeds the value
9fa0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
9fb0: 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20  der.  If these. 
9fc0: 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61   ** situations a
9fd0: 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65  rise, then subse
9fe0: 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65  quent insert ope
9ff0: 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f  rations might co
a000: 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66  rrupt.  ** the f
a010: 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20  reelist.  So we 
a020: 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  do need to check
a030: 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20   for corruption 
a040: 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20  while scanning. 
a050: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a060: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
a070: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a080: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a090: 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61  1;.  iLast = pPa
a0a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a0b0: 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72  ize - 4;.  asser
a0c0: 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20  t( start<=iLast 
a0d0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  );.  while( (pbe
a0e0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a0f0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
a100: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
a110: 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  {.    if( pbegin
a120: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
a130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a140: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a150: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62   }.    addr = pb
a160: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  egin;.  }.  if( 
a170: 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a  pbegin>iLast ){.
a180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a190: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a1a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
a1b0: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
a1c0: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
a1d0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
a1e0: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
a1f0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
a200: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
a210: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a220: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
a230: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
a240: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75  Page->nFree + (u
a250: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
a260: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
a270: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
a280: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a290: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a2a0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a2b0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
a2c0: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
a2d0: 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73  psize, x;.    as
a2e0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
a2f0: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
a300: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
a310: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
a320: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
a330: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a340: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
a350: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
a360: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
a370: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
a380: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
a390: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
a3a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
a3b0: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
a3c0: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
a3d0: 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c    if( (frag<0) |
a3e0: 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74  | (frag>(int)dat
a3f0: 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20  a[hdr+7]) ){.   
a400: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a410: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
a430: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75  ata[hdr+7] -= (u
a440: 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20  8)frag;.      x 
a450: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a460: 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20  [pnext]);.      
a470: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a480: 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20  begin], x);.    
a490: 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65    x = pnext + ge
a4a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
a4b0: 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b  xt+2]) - pbegin;
a4c0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
a4d0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
a4e0: 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   x);.    }else{.
a4f0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
a500: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
a510: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
a520: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
a530: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
a540: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
a550: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
a560: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
a570: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
a580: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
a590: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
a5a0: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
a5b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a5c0: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
a5d0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
a5e0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
a5f0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a600: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a610: 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  ) + get2byte(&da
a620: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
a630: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
a640: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
a650: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
a660: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
a670: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
a680: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
a690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a6a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
a6b0: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
a6c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a6d0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
a6e0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
a6f0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
a700: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
a710: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
a720: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
a730: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
a740: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
a750: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
a760: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
a770: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
a780: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
a790: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
a7a0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
a7b0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
a7c0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
a7d0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
a7e0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
a7f0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
a800: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
a810: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
a820: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
a830: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
a840: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
a850: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
a860: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
a870: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
a880: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
a890: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a8a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
a8b0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
a8c0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
a8d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a8e0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a8f0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a900: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
a910: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
a920: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
a930: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
a940: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
a950: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
a960: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
a970: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
a980: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
a990: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
a9a0: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
a9b0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
a9c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
a9d0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
a9e0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
a9f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
aa00: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
aa10: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
aa20: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
aa30: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
aa40: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
aa50: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
aa60: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
aa70: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
aa80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
aa90: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
aaa0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
aab0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
aac0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
aad0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
aae0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
aaf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ab00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
ab10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ab20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
ab30: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
ab40: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
ab50: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
ab60: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
ab70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
ab80: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
ab90: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
aba0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
abb0: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
abc0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
abd0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
abe0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
abf0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
ac00: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
ac10: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
ac20: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
ac30: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
ac40: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
ac50: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
ac60: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
ac70: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
ac80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ac90: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
aca0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
acb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
acc0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
acd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ace0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
acf0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ad00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ad10: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
ad20: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
ad30: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ad40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
ad50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
ad60: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
ad70: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ad80: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
ad90: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
ada0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
adb0: 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66  DbPage) );..  if
adc0: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
add0: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20   ){.    u16 pc; 
ade0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
adf0: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
ae00: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
ae10: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
ae20: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
ae30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
ae40: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
ae50: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
ae60: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
ae70: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
ae80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
ae90: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
aea0: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
aeb0: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
aec0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31  ucture */.    u1
aed0: 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  6 usableSize;   
aee0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
aef0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
af00: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75  ch page */.    u
af10: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
af20: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
af30: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
af40: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
af50: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
af60: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
af70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
af80: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
af90: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
afa0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
afb0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
afc0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
afd0: 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74   area */.    int
afe0: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
aff0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b000: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
b010: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
b020: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74     int iCellLast
b030: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
b040: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
b050: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
b060: 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50  */..    pBt = pP
b070: 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68  age->pBt;..    h
b080: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b090: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
b0a0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b0b0: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
b0c0: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
b0d0: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
b0e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b0f0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
b100: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
b110: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
b120: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
b130: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
b140: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
b150: 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e - 1;.    pPage
b160: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
b170: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
b180: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
b190: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
b1a0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
b1b0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
b1c0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
b1d0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
b1e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b1f0: 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ]);.    pPage->n
b200: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
b210: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
b220: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
b230: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
b240: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
b250: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
b260: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
b270: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
b280: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
b290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b2a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b2b0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
b2c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
b2d0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a  X_CELL(pBt) );..
b2e0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d      /* A malform
b2f0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b300: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 65   might cause use
b310: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b320: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b330: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b340: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b350: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b360: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b370: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b380: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b390: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b3a0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b3b0: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b3c0: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b3e0: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b3f0: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b400: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b410: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b420: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b430: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b440: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b450: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b460: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b470: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b480: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b490: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b4a0: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b4b0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b4c0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b4d0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b4e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b4f0: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b500: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b510: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b520: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b530: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b540: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b550: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b560: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b570: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b580: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b590: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b5a0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b5b0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b5c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b5d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b5e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b600: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b620: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b630: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b640: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b650: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b660: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b670: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
b680: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
b690: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b6a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b6c0: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
b6d0: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
b6e0: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
b6f0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
b700: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
b710: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
b720: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
b730: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b740: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
b750: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
b760: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
b770: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
b780: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
b790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
b7a0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
b7b0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
b7c0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
b7d0: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
b7e0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
b7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b800: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
b810: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
b820: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b830: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
b840: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b850: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
b860: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
b870: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
b880: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
b890: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
b8a0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
b8b0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
b8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b8d0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
b8e0: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
b8f0: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
b900: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
b910: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
b920: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
b930: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
b940: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
b950: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
b960: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
b970: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
b980: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
b990: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
b9a0: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
b9b0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
b9c0: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
b9d0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
b9e0: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
b9f0: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
ba00: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
ba10: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
ba20: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
ba30: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
ba40: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
ba50: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
ba60: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
ba70: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
ba80: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
ba90: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
baa0: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
bab0: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
bac0: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
bad0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
baf0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bb00: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
bb10: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d 20 69  Free = nFree - i
bb20: 43 65 6c 6c 46 69 72 73 74 3b 0a 20 20 20 20 70  CellFirst;.    p
bb30: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
bb40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
bb50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bb60: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
bb70: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
bb80: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
bb90: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
bba0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
bbb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bbc0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
bbd0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
bbe0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
bbf0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
bc00: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
bc10: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
bc20: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
bc30: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
bc40: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
bc50: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
bc60: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
bc70: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
bc80: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
bc90: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
bca0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
bcb0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
bcc0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
bcd0: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
bce0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
bcf0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
bd00: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
bd10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bd20: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
bd30: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
bd40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
bd50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
bd60: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
bd70: 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61  ;.  /*memset(&da
bd80: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
bd90: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
bda0: 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72  r);*/.  data[hdr
bdb0: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
bdc0: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
bdd0: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
bde0: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30  TF_LEAF)==0 ?1:0
bdf0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
be00: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
be10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
be20: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
be30: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
be40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
be50: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
be60: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
be70: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
be80: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
be90: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
bea0: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
beb0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
bec0: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
bed0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
bee0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
bef0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
bf00: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
bf10: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70  ze<=32768 );.  p
bf20: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
bf30: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
bf40: 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65   1;.  pPage->nCe
bf50: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
bf60: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
bf70: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
bf80: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
bf90: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
bfa0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
bfb0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
bfc0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
bfd0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
bfe0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
bff0: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
c000: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
c010: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
c020: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
c030: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
c040: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c050: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
c060: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
c070: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c080: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
c090: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
c0a0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
c0b0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
c0c0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
c0d0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c0e0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
c0f0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
c100: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
c110: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
c120: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c130: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
c140: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
c150: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
c160: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
c170: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
c180: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
c190: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
c1a0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
c1b0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
c1c0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
c1d0: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
c1e0: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
c1f0: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
c200: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
c210: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
c220: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
c230: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
c240: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
c250: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
c260: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
c270: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
c280: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
c290: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
c2a0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
c2b0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
c2c0: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
c2d0: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
c2e0: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
c2f0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
c300: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
c310: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
c320: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
c330: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
c340: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
c350: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
c360: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
c370: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
c380: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
c390: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
c3a0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
c3b0: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
c3c0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
c3d0: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
c3e0: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
c3f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
c400: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
c410: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c420: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
c440: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
c450: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
c460: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
c470: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
c480: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
c490: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c4a0: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
c4b0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
c4c0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
c4d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
c4e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c4f0: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
c500: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
c510: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
c520: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
c530: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
c540: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c550: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
c560: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c570: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c580: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c590: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c5a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
c5b0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
c5c0: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
c5d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
c5e0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
c5f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
c600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c610: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c620: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
c630: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
c640: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
c650: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
c660: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
c670: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
c680: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
c690: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
c6a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c6b0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
c6c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c6d0: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
c6e0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
c6f0: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
c700: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
c710: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
c720: 74 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72  tatic Pgno pager
c730: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
c740: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
c750: 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e  nPage = -1;.  in
c760: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
c770: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20  pBt->pPage1 );. 
c780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c790: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
c7a0: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
c7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
c7c0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61  SQLITE_OK || nPa
c7d0: 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75  ge==-1 );.  retu
c7e0: 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a  rn (Pgno)nPage;.
c7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
c800: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
c810: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
c820: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
c830: 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61  ine.** is just a
c840: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
c850: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
c860: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  rate calls to.**
c870: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
c880: 61 6e 64 20 62 74 72 65 65 49 6e 69 74 50 61 67  and btreeInitPag
c890: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
c8a0: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
c8b0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
c8c0: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
c8d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
c8e0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c8f0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c900: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c910: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
c920: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20  mPage **ppPage  
c930: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
c940: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
c950: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c960: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
c970: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
c980: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c990: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
c9a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
c9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c9c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c9d0: 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  ; .  }..  /* It 
c9e0: 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61 73  is often the cas
c9f0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
ca00: 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65 61  we want is alrea
ca10: 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a  dy in cache..  *
ca20: 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74 20  * If so, get it 
ca30: 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
ca40: 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68 61  saves us from ha
ca50: 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  ving to call.  *
ca60: 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  * pagerPagecount
ca70: 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  () to make sure 
ca80: 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20 6c  pgno is within l
ca90: 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65 73  imits, which res
caa0: 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d  ults.  ** in a m
cab0: 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66 6f  easureable perfo
cac0: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
cad0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50  nts..  */.  *ppP
cae0: 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62 74  age = pPage = bt
caf0: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
cb00: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  t, pgno);.  if( 
cb10: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  pPage ){.    /* 
cb20: 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  Page is already 
cb30: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
cb40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
cb60: 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63 68  Page not in cach
cb70: 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e 20  e.  Acquire it. 
cb80: 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
cb90: 20 70 67 6e 6f 3d 3d 70 61 67 65 72 50 61 67 65   pgno==pagerPage
cba0: 63 6f 75 6e 74 28 70 42 74 29 20 29 3b 0a 20 20  count(pBt) );.  
cbb0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72    if( pgno>pager
cbc0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
cbd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
cbe0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
cbf0: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72  PT; .    }.    r
cc00: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
cc10: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
cc20: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
cc30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cc40: 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50      pPage = *ppP
cc50: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  age;.  }.  if( !
cc60: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
cc70: 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
cc80: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
cc90: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
cca0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ccb0: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
ccc0: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
ccd0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
cce0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
ccf0: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
cd00: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
cd10: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
cd20: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
cd30: 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
cd40: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
cd50: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
cd60: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
cd70: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
cd80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cd90: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
cda0: 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
cdb0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
cdc0: 65 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b  e->pDbPage)>1 );
cdd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cde0: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
cdf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ce00: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
ce10: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
ce20: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
ce30: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
ce40: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
ce50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ce60: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
ce70: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
ce80: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
ce90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cea0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
ceb0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
cec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
ced0: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
cee0: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
cef0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
cf00: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
cf10: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
cf20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
cf30: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
cf40: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
cf50: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
cf60: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
cf70: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
cf80: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
cf90: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
cfa0: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
cfb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
cfc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
cfd0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
cfe0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
cff0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
d000: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
d010: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
d020: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
d030: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
d040: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
d050: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
d060: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
d070: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
d080: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
d090: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
d0a0: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
d0b0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d0c0: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d0d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
d0e0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
d0f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d100: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d110: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d120: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d130: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
d140: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d150: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d160: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
d170: 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
d180: 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
d190: 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
d1a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
d1b0: 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
d1c0: 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
d1d0: 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
d1e0: 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
d1f0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
d200: 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
d210: 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
d220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d230: 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
d240: 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
d250: 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
d260: 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
d270: 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
d280: 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
d290: 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
d2a0: 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
d2b0: 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
d2c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
d2d0: 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
d2e0: 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
d2f0: 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
d300: 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
d310: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
d320: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
d330: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
d340: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
d350: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
d360: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
d370: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
d380: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
d390: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
d3a0: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
d3b0: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
d3c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d3d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d3e0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
d3f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
d400: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d410: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
d420: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
d430: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
d440: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
d450: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
d460: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
d470: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
d480: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
d490: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
d4a0: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
d4b0: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
d4c0: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
d4d0: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
d4e0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
d4f0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
d500: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
d510: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
d520: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
d530: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
d540: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
d550: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
d560: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
d570: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
d580: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
d590: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  osed..**.** If t
d5a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
d5b0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
d5c0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
d5d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
d5e0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
d5f0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
d600: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
d610: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
d620: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
d630: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
d640: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
d650: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
d660: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
d670: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d680: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
d690: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
d6a0: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
d6b0: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
d6c0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
d6d0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
d6e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
d6f0: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
d700: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
d710: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
d720: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
d730: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d740: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
d750: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
d760: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
d770: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
d780: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d790: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
d7a0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
d7b0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
d7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
d7d0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
d7e0: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
d7f0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
d800: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
d810: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
d820: 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ) */.){.  sqlite
d830: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d850: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
d860: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
d870: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
d880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d890: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
d8a0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
d8b0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
d8e0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
d8f0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
d900: 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
d910: 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
d920: 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
d930: 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
d940: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d960: 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
d970: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
d980: 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
d9b0: 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
d9c0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
d9d0: 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
d9e0: 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
d9f0: 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
da00: 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65  tent */..  /* Se
da10: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
da20: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
da30: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
da40: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
da50: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
da60: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
da70: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
da80: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
da90: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
daa0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
dab0: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
dac0: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
dad0: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
dae0: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
daf0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
db00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
db10: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
db20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
db30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
db40: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
db50: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
db60: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
db70: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
db80: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
db90: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
dba0: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
dbb0: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
dbc0: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
dbd0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
dbe0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
dbf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dc00: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
dc10: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62   );..  pVfs = db
dc20: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
dc30: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
dc40: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
dc50: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
dc60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dc70: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
dc80: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
dc90: 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
dca0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
dcb0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
dcc0: 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
dcd0: 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
dce0: 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
dcf0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
dd00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
dd10: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
dd20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dd30: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
dd40: 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
dd50: 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
dd60: 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
dd70: 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
dd80: 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
dd90: 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
dda0: 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
ddb0: 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
ddc0: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30    if( isMemdb==0
ddd0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26   && zFilename &&
dde0: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
ddf0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
de00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
de10: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
de20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
de30: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
de40: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
de50: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
de60: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
de70: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
de80: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
de90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
dea0: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
deb0: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
dec0: 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   1;.      db->fl
ded0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
dee0: 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20  aredCache;.     
def0: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
df00: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
df10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
df20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
df30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
df40: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
df50: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
df60: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
df70: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
df80: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
df90: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
dfa0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
dfb0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
dfc0: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
dfd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
dfe0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
dff0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
e000: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
e010: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e020: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e030: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
e040: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e050: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
e060: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
e070: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e080: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e090: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
e0a0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
e0b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e0c0: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
e0d0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
e0e0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
e0f0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
e100: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
e110: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
e120: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e130: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
e140: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
e150: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
e160: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
e170: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
e180: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
e190: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
e1a0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
e1b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
e1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
e1d0: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
e1e0: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
e1f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
e200: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e210: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
e220: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
e230: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e240: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
e250: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e260: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
e270: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e290: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
e2a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e2b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
e2c0: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
e2d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
e2e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
e2f0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
e300: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
e310: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e320: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
e340: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e350: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
e360: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
e370: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e380: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
e390: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
e3a0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
e3b0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
e3c0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
e3d0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
e3e0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
e3f0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
e400: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
e410: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
e420: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
e430: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
e440: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
e450: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
e460: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
e470: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e480: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
e490: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
e4a0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
e4b0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
e4c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
e4d0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
e4e0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
e4f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
e500: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
e510: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
e520: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
e530: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
e540: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
e550: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
e560: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
e570: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
e580: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
e590: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
e5a0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
e5b0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
e5c0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
e5d0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e5e0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
e5f0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
e600: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e610: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
e620: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
e630: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
e640: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
e650: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
e660: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
e670: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
e680: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e690: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
e6a0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
e6b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
e6c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e6d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e6e0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e6f0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e700: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
e710: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
e720: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
e750: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
e760: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e790: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
e7a0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
e7b0: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
e7c0: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
e7d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
e7e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e7f0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e800: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
e810: 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
e820: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e830: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
e840: 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
e850: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
e860: 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
e870: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
e880: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e890: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
e8a0: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
e8b0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
e8c0: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
e8d0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
e8e0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
e8f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
e900: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
e910: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
e920: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
e930: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
e940: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
e950: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
e960: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
e970: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
e980: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
e990: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
e9a0: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
e9b0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
e9c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
e9d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e9e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e9f0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ea00: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
ea10: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
ea20: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
ea30: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
ea40: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
ea50: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
ea60: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
ea70: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
ea80: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
ea90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
eaa0: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
eab0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
eac0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
ead0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
eae0: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
eaf0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
eb00: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
eb10: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
eb20: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
eb30: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
eb40: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
eb50: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
eb60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
eb70: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
eb80: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
eb90: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
eba0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
ebb0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ebc0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
ebd0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
ebe0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
ebf0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
ec00: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
ec10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ec20: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
ec30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ec40: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
ec50: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
ec60: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
ec70: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
ec80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ec90: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
eca0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ecb0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
ecc0: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
ecd0: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
ece0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
ecf0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
ed00: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
ed10: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
ed20: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ed30: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
ed40: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
ed50: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
ed60: 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
ed70: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
ed80: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
ed90: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
eda0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
edb0: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
edc0: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
edd0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
ede0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
edf0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
ee00: 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
ee10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ee20: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ee30: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ee40: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
ee50: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
ee60: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
ee70: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
ee80: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
ee90: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
eea0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
eeb0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
eec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
eed0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
eee0: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
eef0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
ef00: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
ef10: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
ef20: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
ef30: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
ef40: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
ef50: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
ef60: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
ef70: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
ef80: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
ef90: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
efa0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
efb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
efc0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
efd0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
efe0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
eff0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
f000: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
f010: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
f020: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
f030: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f040: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f050: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
f060: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
f070: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
f080: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f090: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
f0a0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
f0b0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f0c0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
f0d0: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
f0e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f0f0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f100: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f110: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f120: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f130: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
f140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
f150: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
f160: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
f170: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
f180: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
f190: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
f1a0: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
f1b0: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
f1c0: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
f1d0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
f1e0: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
f1f0: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
f200: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
f210: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
f220: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
f230: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
f240: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
f250: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f260: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f270: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
f280: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f290: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
f2a0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
f2b0: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f2c0: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
f2d0: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
f2e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
f2f0: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
f300: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
f310: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f320: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
f330: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
f340: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
f350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f360: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
f370: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
f380: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
f390: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f3a0: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
f3b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
f3c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
f3d0: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
f3e0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
f3f0: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
f400: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
f410: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
f420: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
f430: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
f440: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f450: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
f460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f480: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f490: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
f4a0: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
f4b0: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
f4c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f4d0: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
f4e0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
f4f0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
f500: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f510: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f520: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
f530: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f540: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
f550: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74  0;.  }.  if( mut
f560: 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
f570: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f580: 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
f590: 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
f5a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f5b0: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
f5c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f5d0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
f5e0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
f5f0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
f600: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
f610: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
f620: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
f630: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
f640: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
f650: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
f660: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f670: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
f680: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
f690: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
f6a0: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
f6b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f6c0: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
f6d0: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
f6e0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
f6f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f700: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
f710: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
f720: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
f730: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
f740: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
f750: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
f760: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
f770: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
f780: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f790: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f7a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f7b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f7c0: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
f7d0: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
f7e0: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
f7f0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
f800: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f810: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f820: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
f830: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
f840: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f850: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
f860: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
f870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
f880: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
f890: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f8a0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
f8b0: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
f8c0: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
f8d0: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
f8e0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
f8f0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
f900: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
f910: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
f920: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
f930: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
f940: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
f950: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
f960: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
f970: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f980: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
f990: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
f9a0: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
f9b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f9c0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
f9d0: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
f9e0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
f9f0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
fa00: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
fa10: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
fa20: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
fa30: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
fa40: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
fa50: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
fa60: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
fa70: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
fa80: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
fa90: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
faa0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fab0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
fac0: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
fad0: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
fae0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
faf0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
fb00: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
fb10: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
fb20: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
fb30: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
fb40: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
fb50: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
fb60: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
fb70: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
fb80: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
fb90: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
fba0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
fbb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fbc0: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
fbd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fbe0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
fbf0: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
fc00: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
fc10: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
fc20: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
fc30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fc40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
fc50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
fc60: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
fc70: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
fc80: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
fc90: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
fca0: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
fcb0: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
fcc0: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
fcd0: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
fce0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
fcf0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
fd00: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
fd10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
fd20: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
fd30: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
fd40: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
fd50: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
fd60: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
fd70: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
fd80: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
fd90: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
fda0: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
fdb0: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
fdc0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
fdd0: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
fde0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
fdf0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
fe00: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
fe10: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
fe20: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
fe30: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
fe40: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
fe50: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
fe60: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
fe70: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
fe80: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
fe90: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
fea0: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
feb0: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
fec0: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
fed0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
fee0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
fef0: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
ff00: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
ff10: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
ff20: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
ff30: 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
ff40: 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
ff50: 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
ff60: 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
ff70: 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
ff80: 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
ff90: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
ffa0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
ffb0: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
ffc0: 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
ffd0: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ffe0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
fff0: 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
10000 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
10010 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
10020 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
10030 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10040 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10050 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
10060 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
10070 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
10080 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10090 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
100a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
100b0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
100c0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
100d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
100e0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
100f0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
10100 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
10110 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
10120 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
10130 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10140 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
10150 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
10160 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10170 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10180 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
10190 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
101a0 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
101b0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
101c0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
101d0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
101e0 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
101f0 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
10200 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
10210 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
10220 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
10230 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
10240 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
10250 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
10260 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
10270 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
10280 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
10290 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
102a0 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
102b0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
102c0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
102d0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
102e0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
102f0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
10300 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
10310 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
10320 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
10330 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
10340 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
10350 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
10360 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
10370 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
10380 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
10390 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
103a0 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
103b0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
103c0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
103d0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
103e0 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
103f0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
10400 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
10410 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
10420 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
10430 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10440 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
10450 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
10460 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
10470 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10480 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10490 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
104a0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
104b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
104c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
104d0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
104e0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
104f0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
10500 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10510 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10520 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10530 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
10540 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
10550 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
10560 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
10570 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
10580 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
10590 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
105a0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
105b0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
105c0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
105d0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
105e0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
105f0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
10600 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
10610 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
10620 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
10630 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
10640 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
10650 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
10660 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
10670 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10680 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
10690 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
106a0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
106b0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
106c0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
106d0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
106e0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
106f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
10700 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
10710 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
10720 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
10730 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
10740 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
10750 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10760 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10780 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10790 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
107a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
107b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
107c0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
107d0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
107e0 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
107f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10810 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
10820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
10830 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
10840 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
10850 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
10860 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
10870 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
10880 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
10890 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
108a0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
108b0 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
108c0 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
108d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
108e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
108f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
10900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10910 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10920 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
10930 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
10940 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
10950 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
10960 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
10970 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
10980 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
10990 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
109a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
109b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
109c0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
109d0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
109e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
109f0 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  UM)./*.** Change
10a00 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
10a10 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
10a20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
10a30 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
10a40 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
10a50 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
10a60 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
10a70 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10a80 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
10a90 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
10aa0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
10ab0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
10ac0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
10ad0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
10ae0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
10af0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
10b00 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
10b10 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
10b20 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
10b30 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
10b40 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
10b50 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
10b60 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
10b70 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
10b80 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
10b90 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
10ba0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
10bb0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
10bc0 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
10bd0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
10be0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
10bf0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
10c00 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
10c10 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
10c20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10c30 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
10c40 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
10c50 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
10c60 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10c70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10c80 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
10c90 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
10ca0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
10cb0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
10cc0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69   then the pageSi
10cd0 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20  zeFixed flag is 
10ce0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
10cf0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
10d00 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
10d10 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
10d20 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
10d30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
10d40 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10d50 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
10d60 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
10d70 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
10d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10d90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10da0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
10db0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
10dc0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
10dd0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
10de0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10df0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
10e00 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
10e10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10e20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
10e30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
10e40 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
10e50 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
10e60 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
10e70 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
10e80 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
10e90 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
10ea0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
10eb0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
10ec0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
10ed0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
10ee0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
10ef0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
10f00 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
10f10 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
10f20 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
10f30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
10f40 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
10f50 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
10f60 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
10f70 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
10f80 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
10f90 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10fa0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10fb0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10fc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
10fd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
10fe0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
10ff0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11000 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
11010 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11020 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
11030 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
11040 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11050 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11070 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11080 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
11090 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
110a0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
110b0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
110c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
110d0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
110e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
110f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
11100 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
11110 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
11120 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
11130 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
11140 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
11150 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
11160 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
11170 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
11180 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
11190 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
111a0 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
111b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
111c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
111d0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
111e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
111f0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
11200 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
11210 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11220 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11230 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
11240 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
11250 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
11260 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
11270 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
11280 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
11290 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
112a0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
112b0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
112c0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
112d0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
112e0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
112f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
11300 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
11310 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
11320 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
11330 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11340 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
11350 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11360 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
11370 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11380 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11390 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
113a0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
113b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
113c0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
113d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
113e0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
113f0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11400 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
11410 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
11420 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
11430 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
11440 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
11450 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
11460 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
11470 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
11480 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
11490 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
114a0 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
114b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
114c0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
114d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
114e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
114f0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
11500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11510 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
11520 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
11530 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
11540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11550 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
11560 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
11570 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
11580 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11590 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
115a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
115b0 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
115c0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
115d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
115e0 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
115f0 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
11600 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
11610 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
11620 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
11640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11650 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
11660 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
11670 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
11680 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11690 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
116a0 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
116b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
116c0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
116d0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
116e0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
116f0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
11700 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
11710 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
11720 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11730 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
11740 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
11750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11760 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11770 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
11780 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
11790 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
117a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
117b0 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
117c0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
117d0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
117e0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
117f0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
11800 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11810 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
11820 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
11830 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
11840 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11850 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11860 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
11870 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
11880 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
11890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
118a0 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
118b0 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
118c0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
118d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
118e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
118f0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
11900 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
11910 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
11920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
11930 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
11940 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
11950 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
11960 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
11970 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
11980 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
11990 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
119a0 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
119b0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
119c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
119d0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
119e0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
119f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11a00 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
11a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11a30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11a40 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
11a50 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
11a60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
11a70 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
11a80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11a90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
11aa0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
11ab0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
11ac0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
11ad0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
11ae0 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
11af0 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
11b00 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  . .  */.  rc = s
11b10 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
11b20 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
11b30 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
11b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11b50 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
11b60 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11b70 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e  }else if( nPage>
11b80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67  0 ){.    int pag
11b90 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75  eSize;.    int u
11ba0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
11bb0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
11bc0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
11bd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
11be0 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
11bf0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
11c00 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
11c10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11c20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11c30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
11c40 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
11c50 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
11c60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
11c70 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
11c80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
11c90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
11ca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
11cb0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
11cc0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
11cd0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
11ce0 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
11cf0 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
11d00 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
11d10 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
11d20 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
11d30 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
11d40 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
11d50 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
11d60 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
11d70 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
11d80 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
11d90 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
11da0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
11db0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
11dc0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
11dd0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
11de0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
11df0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
11e00 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
11e10 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
11e20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
11e30 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
11e40 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
11e50 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
11e60 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
11e70 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
11e80 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
11e90 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
11ea0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
11eb0 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
11ec0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11ed0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11ee0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11ef0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11f00 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
11f10 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
11f20 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
11f30 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
11f40 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
11f50 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
11f60 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
11f70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11f80 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
11f90 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
11fa0 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
11fb0 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
11fc0 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
11fd0 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
11fe0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
11ff0 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
12000 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
12010 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
12020 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
12030 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
12040 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
12050 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
12060 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
12070 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
12080 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
12090 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
120a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
120b0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
120c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
120d0 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
120e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
120f0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
12100 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
12110 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
12120 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12130 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
12140 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
12150 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
12160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
12190 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
121a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
121b0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
121c0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
121d0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
121e0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
121f0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
12200 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
12210 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
12220 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
12230 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
12240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12250 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
12260 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
12270 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
12280 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
12290 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
122a0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
122b0 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
122c0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
122d0 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
122e0 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
122f0 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
12300 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
12310 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
12320 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
12330 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
12340 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
12350 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
12360 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
12370 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
12380 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
12390 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
123a0 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
123b0 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
123c0 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
123d0 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
123e0 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
123f0 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
12400 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
12410 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
12420 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
12430 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
12440 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
12450 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
12460 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
12470 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
12480 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
12490 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61  2-byte poiner, a
124a0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
124b0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
124c0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
124d0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
124e0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
124f0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
12500 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
12510 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
12520 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
12530 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
12540 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
12550 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
12560 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
12570 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
12580 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
12590 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75  maxLeaf = pBt->u
125a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a  sableSize - 35;.
125b0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
125c0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
125d0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
125e0 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  3;.  assert( pBt
125f0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
12600 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
12610 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
12620 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
12630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12640 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
12650 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
12660 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
12670 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
12680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12690 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
126a0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
126b0 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
126c0 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
126d0 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
126e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
126f0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
12700 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12710 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
12720 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
12730 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
12740 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12750 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
12760 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
12770 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
12780 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
12790 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
127a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
127b0 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
127c0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
127d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
127e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
127f0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
12800 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
12810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12820 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12830 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12840 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74  Cursor==0 || pBt
12850 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
12860 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
12870 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
12880 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
12890 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
128a0 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  1!=0 ){.    asse
128b0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
128c0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
128d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
128e0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
128f0 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
12900 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12910 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
12920 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12930 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
12940 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
12950 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
12960 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
12970 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
12980 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
12990 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
129a0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
129b0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
129c0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
129d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
129e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
129f0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
12a00 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
12a10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12a20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
12a30 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
12a40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12a50 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
12a60 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
12a70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12a80 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
12a90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12aa0 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
12ab0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
12ac0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
12ad0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
12ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12af0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
12b00 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
12b10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12b20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
12b30 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
12b40 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
12b50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
12b60 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
12b70 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
12b80 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
12b90 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
12ba0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
12bb0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
12bc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
12bd0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
12be0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
12bf0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
12c00 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
12c10 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
12c20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
12c30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
12c40 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
12c50 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
12c60 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
12c70 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
12c80 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
12c90 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
12ca0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
12cb0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
12cc0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
12cd0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
12ce0 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
12cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12d00 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
12d10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
12d20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
12d30 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
12d40 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
12d50 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
12d60 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
12d70 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
12d80 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
12d90 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
12da0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
12db0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
12dc0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
12dd0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
12de0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
12df0 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
12e00 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
12e10 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
12e20 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
12e30 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
12e40 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
12e50 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
12e60 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
12e70 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
12e80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12e90 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
12ea0 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
12eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
12ec0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
12ed0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
12ee0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
12ef0 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
12f00 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
12f10 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
12f20 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
12f30 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
12f40 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
12f50 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
12f60 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
12f70 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
12f80 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
12f90 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
12fa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
12fb0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
12fc0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
12fd0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
12fe0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
12ff0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
13000 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
13010 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13020 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
13030 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
13040 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13050 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
13060 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
13070 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
13080 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13090 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
130a0 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
130b0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
130c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
130d0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
130e0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
130f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
13100 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
13110 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
13120 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
13130 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
13140 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
13150 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
13160 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
13170 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
13180 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
13190 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
131a0 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
131b0 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
131c0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
131d0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
131e0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
131f0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
13200 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
13210 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
13220 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
13230 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
13240 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
13250 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
13260 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
13270 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
13280 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
13290 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
132a0 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
132b0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
132c0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
132d0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
132e0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
132f0 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
13300 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
13310 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
13320 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
13330 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
13340 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
13350 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
13360 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
13370 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
13380 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
13390 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
133a0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
133b0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
133c0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
133d0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
133e0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
133f0 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
13400 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
13410 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
13420 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
13430 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
13440 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
13450 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
13460 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
13470 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
13480 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13490 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
134a0 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
134b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
134c0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
134d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
134e0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
134f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
13500 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13510 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
13520 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
13530 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
13540 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
13550 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
13560 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
13570 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
13580 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
13590 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
135a0 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
135b0 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
135c0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
135d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
135e0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
135f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
13600 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
13610 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
13620 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
13630 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
13640 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
13650 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
13660 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
13670 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
13680 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
13690 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
136a0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
136b0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
136c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
136d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
136e0 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
136f0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
13700 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
13710 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
13720 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
13730 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
13740 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
13750 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
13760 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
13770 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
13780 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
13790 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
137a0 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
137b0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
137c0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
137d0 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e  E) || pBt->isPen
137e0 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f  ding ){.    pBlo
137f0 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
13800 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
13810 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
13820 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
13830 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
13840 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
13850 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
13860 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
13870 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
13880 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
13890 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
138a0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
138b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
138c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
138d0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
138e0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
138f0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
13900 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
13910 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
13920 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
13930 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
13940 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13950 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
13960 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
13970 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
13980 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
13990 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
139a0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
139b0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
139c0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
139d0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
139e0 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
139f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
13a00 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
13a10 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
13a20 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
13a30 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
13a40 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
13a50 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
13a60 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
13a70 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64 6f 20 7b  s_begun;..  do {
13a80 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
13a90 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
13aa0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
13ab0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
13ac0 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
13ad0 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
13ae0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
13af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
13b00 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
13b10 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
13b20 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
13b30 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
13b40 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
13b50 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
13b60 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
13b70 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
13b80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
13b90 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
13ba0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
13bb0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
13bc0 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
13bd0 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
13be0 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
13bf0 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
13c00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
13c10 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
13c20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
13c30 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
13c40 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
13c50 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
13c60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13c70 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
13c80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
13c90 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
13ca0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13cb0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
13cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13ce0 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
13cf0 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
13d00 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
13d10 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
13d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13d40 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
13d50 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
13d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13d70 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
13d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13d90 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13da0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
13db0 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
13dc0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
13dd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13de0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
13df0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
13e00 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13e10 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
13e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e30 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
13e40 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
13e50 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
13e60 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
13e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13e80 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13e90 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
13ea0 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28  able ){..assert(
13eb0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
13ec0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
13ed0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
13ee0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
13ef0 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
13f00 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
13f10 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
13f20 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
13f30 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
13f40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
13f50 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
13f60 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
13f70 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
13f80 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
13f90 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
13fa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
13fb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
13fc0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
13fd0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69  nTrans;.    }.#i
13fe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13ff0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
14000 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
14010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14020 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
14030 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
14040 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
14050 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
14060 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b   (u8)(wrflag>1);
14070 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14080 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
14090 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
140a0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
140b0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
140c0 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
140d0 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
140e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
140f0 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
14100 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
14110 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
14120 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
14130 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
14140 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
14150 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
14160 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
14170 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
14180 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
14190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
141a0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
141b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
141c0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
141d0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
141e0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
141f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14200 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14210 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14220 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14230 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
14240 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
14250 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
14260 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
14270 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
14280 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
14290 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
142a0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
142b0 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
142c0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
142d0 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
142e0 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
142f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14300 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
14310 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
14320 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
14350 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
14360 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14390 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
143a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
143d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
143e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
143f0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
14400 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
14410 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
14420 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
14430 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
14440 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14450 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
14460 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
14470 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
14480 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
14490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
144a0 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
144b0 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
144c0 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
144d0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
144e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
144f0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
14500 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
14510 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
14520 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
14530 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
14540 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
14550 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
14560 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
14570 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
14580 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
14590 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
145a0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
145b0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
145c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
145d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
145e0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
145f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
14600 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
14610 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
14620 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
14630 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
14640 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
14650 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
14660 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
14670 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
14680 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
14690 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
146a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
146b0 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
146c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
146d0 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
146e0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
146f0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
14700 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
14710 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
14720 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
14730 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
14740 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
14750 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
14760 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
14770 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
14780 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
14790 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
147a0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
147c0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
147d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
147e0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
147f0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
14800 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
14810 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
14840 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
14850 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
14860 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
14870 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
14880 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
14890 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
148a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
148b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
148c0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
148d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
148e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
148f0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
14900 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
14910 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
14920 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
14930 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
14940 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14950 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14960 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
14970 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
14980 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
14990 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
149a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
149b0 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
149c0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
149d0 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
149e0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
149f0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
14a00 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
14a10 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
14a20 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
14a30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14a40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14a50 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
14a60 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
14a70 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
14a80 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
14a90 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
14aa0 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
14ab0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
14ac0 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50  ..    btreeInitP
14ad0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
14ae0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14af0 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
14b00 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
14b10 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
14b20 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
14b30 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
14b40 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
14b50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
14b60 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
14b70 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72  nfo;.        btr
14b80 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
14b90 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
14ba0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
14bb0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
14bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
14bd0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
14be0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
14bf0 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
14c00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14c10 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
14c20 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
14c30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14c40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14c60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
14c70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
14c80 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
14c90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
14ca0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
14cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14cd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
14ce0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
14cf0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
14d00 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
14d10 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
14d20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
14d30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
14d40 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
14d50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14d60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14d80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
14d90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14da0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
14db0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
14dc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
14dd0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
14de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14df0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
14e00 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
14e10 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
14e20 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
14e30 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
14e40 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
14e50 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
14e60 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
14e70 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
14e80 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
14e90 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
14ea0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
14eb0 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
14ec0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
14ed0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
14ee0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
14ef0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
14f00 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
14f10 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
14f20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
14f30 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
14f40 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
14f50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14f60 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
14f70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
14f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
14f90 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
14fa0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
14fb0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
14fc0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
14fd0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
14fe0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
14ff0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
15000 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
15010 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
15020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
15030 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
15040 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
15050 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
15060 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
15070 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
15080 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
15090 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
150a0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
150b0 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
150c0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
150d0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
150e0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
150f0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
15100 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
15110 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
15120 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
15130 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
15140 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
15150 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
15160 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
15170 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15180 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
15190 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
151a0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
151b0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
151c0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
151d0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
151e0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
151f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
15200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15210 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15220 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
15230 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
15240 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
15250 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
15260 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
15270 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
15280 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
15290 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
152a0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
152b0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
152c0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
152d0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
152e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
152f0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
15300 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
15310 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
15320 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
15330 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
15340 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
15350 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
15370 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
15380 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
15390 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
153a0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
153b0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
153c0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
153d0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
153e0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
153f0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
15400 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
15410 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
15420 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
15430 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
15440 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
15450 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
15460 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
15470 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
15480 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
15490 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
154a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
154b0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
154c0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
154d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
154e0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
154f0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
15500 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
15510 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
15520 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
15530 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
15540 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15550 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15560 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
15570 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
15580 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
15590 66 28 20 72 63 21 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 65 74 75 72 6e   ){.      return
155b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
155c0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
155d0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
155e0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
155f0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
15600 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
15610 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
15620 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
15630 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
15640 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
15650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15680 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15690 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
156a0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
156b0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
156c0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
156d0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
156e0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
156f0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
15700 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
15710 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
15720 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
15730 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
15740 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
15750 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
15760 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
15770 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
15780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
157a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
157b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
157c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
157d0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
157e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
157f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15800 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
15810 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
15820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15830 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
15840 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
15850 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
15860 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
15870 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15880 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
15890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
158a0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
158b0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
158c0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
158d0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
158e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
158f0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
15900 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
15910 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
15920 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
15930 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
15940 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
15950 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
15960 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
15970 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
15980 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
15990 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
159a0 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
159b0 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
159c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
159d0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
159e0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
159f0 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
15a00 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
15a10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
15a20 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
15a30 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
15a40 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
15a50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15a60 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
15a70 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
15a80 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
15a90 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
15aa0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
15ab0 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
15ac0 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
15ad0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
15ae0 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
15af0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
15b00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
15b10 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
15b20 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
15b30 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
15b40 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
15b50 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
15b60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
15b70 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
15b80 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
15b90 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
15ba0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
15bb0 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
15bc0 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
15bd0 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
15be0 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
15bf0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
15c00 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
15c10 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
15c20 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
15c30 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
15c40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15c50 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
15c60 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
15c70 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
15c80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15c90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15ca0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
15cb0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
15cc0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
15cd0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
15ce0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
15cf0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
15d00 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) ){.    int rc;
15d10 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
15d20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
15d30 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
15d40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
15d50 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
15d60 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
15d70 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
15d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15d90 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
15da0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
15db0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
15dc0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
15dd0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
15de0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15df0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15e00 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
15e10 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
15e20 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
15e30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15e40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
15e50 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
15e60 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
15e70 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
15e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
15e90 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
15ea0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
15eb0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
15ec0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
15ed0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
15ee0 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
15ef0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
15f00 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
15f10 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
15f20 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
15f30 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
15f40 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
15f50 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
15f60 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
15f70 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
15f80 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
15f90 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
15fa0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
15fb0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
15fc0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
15fd0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
15fe0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
15ff0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
16000 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
16010 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
16020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16040 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
16060 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
16070 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
16080 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
16090 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
160a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
160b0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160d0 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
160e0 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
160f0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
16100 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
16110 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
16120 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
16130 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
16140 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
16150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16160 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16170 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
16180 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
16190 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
161a0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
161b0 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
161c0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
161d0 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
161e0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
161f0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
16200 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
16210 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
16220 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
16230 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
16240 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
16250 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
16260 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
16270 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
16280 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
16290 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
162a0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
162b0 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
162c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
162d0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
162e0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
162f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
16300 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
16310 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
16320 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
16330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
16360 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
16370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16390 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
163a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
163b0 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
163c0 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
163d0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
163e0 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
163f0 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
16400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16410 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
16420 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
16430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
16450 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
16460 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
16470 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
16480 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
16490 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
164a0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
164b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
164c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
164d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
164e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
164f0 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20  ..  if( nFin==0 
16500 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  ){.    iLastPg--
16510 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61  ;.    while( iLa
16520 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
16530 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
16540 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16550 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
16560 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
16570 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
16580 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  g) ){.        Me
16590 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20  mPage *pPg;.    
165a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72      int rc = btr
165b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
165c0 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29  LastPg, &pPg, 0)
165d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
165e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
165f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16600 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16620 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
16630 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16640 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16650 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
16660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16680 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16690 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
166a0 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
166b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
166c0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
166d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73  Bt->pPager, iLas
166e0 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tPg);.  }.  retu
166f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16700 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
16710 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
16720 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
16730 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
16740 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
16750 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
16760 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
16770 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
16780 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
16790 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
167a0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
167b0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
167c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
167d0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
167e0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
167f0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
16800 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
16810 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
16820 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
16830 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
16840 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
16850 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
16860 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
16870 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
16880 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16890 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
168a0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
168b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
168c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
168d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
168e0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
168f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
16900 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
16910 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
16920 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16930 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
16940 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
16950 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
16960 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
16970 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
16980 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63  t, 0, pagerPagec
16990 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a  ount(pBt));.  }.
169a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
169b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
169c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
169d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
169e0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
169f0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
16a00 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
16a10 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
16a20 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
16a30 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
16a40 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
16a50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
16a60 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
16a70 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
16a80 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
16a90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16aa0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
16ab0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
16ac0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
16ad0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
16ae0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
16af0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
16b00 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
16b10 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
16b20 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
16b30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16b40 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
16b50 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
16b60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16b70 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
16b80 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
16b90 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
16ba0 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
16bb0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
16bc0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
16bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16be0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16bf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
16c00 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
16c10 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
16c20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
16c30 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
16c40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
16c50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
16c60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
16c70 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
16c80 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
16c90 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
16ca0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16cb0 70 61 67 65 73 20 6e 6f 20 74 68 65 20 66 72 65  pages no the fre
16cc0 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 50 67 6e  elist */.    Pgn
16cd0 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
16ce0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
16cf0 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
16d00 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
16d10 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
16d20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
16d30 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
16d40 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20      int nEntry; 
16d50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16d60 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
16d70 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
16d80 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
16d90 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
16da0 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
16db0 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
16dc0 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61   nOrig = pagerPa
16dd0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
16de0 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
16df0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
16e00 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
16e10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
16e20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
16e30 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
16e40 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
16e50 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
16e60 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
16e70 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
16e80 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
16e90 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
16ea0 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
16eb0 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
16ec0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
16ed0 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
16ee0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
16ef0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
16f00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
16f10 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
16f20 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
16f30 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
16f40 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45  ata[36]);.    nE
16f50 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
16f60 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50  leSize/5;.    nP
16f70 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
16f80 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
16f90 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
16fa0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
16fb0 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
16fc0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
16fd0 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  p;.    if( nOrig
16fe0 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
16ff0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
17000 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17010 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
17020 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
17030 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
17040 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
17050 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
17060 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
17070 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
17080 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  -;.    }.    if(
17090 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
170a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
170b0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66  UPT_BKPT;..    f
170c0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
170d0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
170e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
170f0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
17100 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
17110 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
17120 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
17130 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
17140 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
17150 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
17160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
17170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
17180 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17190 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
171a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
171b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
171c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
171d0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
171e0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
171f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
17200 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
17210 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
17220 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
17230 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
17240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
17260 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
17270 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17280 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
17290 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
172a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
172b0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
172c0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
172d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
172e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
172f0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
17300 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
17310 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
17320 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17330 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
17340 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
17350 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
17360 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
17370 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
17380 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
17390 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
173a0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
173b0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
173c0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
173d0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
173e0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
173f0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
17400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
17410 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
17420 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
17430 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
17440 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
17450 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
17460 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
17470 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
17480 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
17490 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
174a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
174b0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
174c0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
174d0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
174e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
174f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
17500 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
17510 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
17520 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
17530 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
17540 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
17550 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
17560 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
17570 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
17580 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
17590 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
175a0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
175b0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
175c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
175d0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
175e0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
175f0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
17600 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
17610 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
17620 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
17630 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
17640 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
17650 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
17660 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
17670 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
17680 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
17690 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
176a0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
176b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
176c0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
176d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
176e0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
176f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
17700 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
17710 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
17720 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
17730 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
17740 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
17750 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
17760 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
17770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
17780 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
17790 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
177a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
177b0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
177c0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
177d0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
177e0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
177f0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
17800 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
17810 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
17820 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
17830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
17840 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
17850 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
17860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
17870 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17880 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
17890 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
178a0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
178b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
178c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
178d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
178e0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
178f0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17900 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
17910 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
17920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17930 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
17940 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
17950 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
17960 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
17970 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
17980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17990 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
179a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
179b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
179c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
179d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
179e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
179f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
17a00 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
17a10 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
17a20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17a30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17a40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
17a50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
17a60 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
17a70 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
17a80 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
17a90 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
17aa0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
17ab0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
17ac0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
17ad0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
17ae0 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
17af0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17b00 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
17b10 72 20 2a 70 43 73 72 3b 0a 20 20 61 73 73 65 72  r *pCsr;.  asser
17b20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
17b30 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
17b40 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
17b50 20 61 20 63 75 72 73 6f 72 20 68 65 6c 64 20 6f   a cursor held o
17b60 70 65 6e 20 62 79 20 74 68 69 73 20 62 2d 74 72  pen by this b-tr
17b70 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  ee connection. I
17b80 66 20 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20 20  f one exists,.  
17b90 2a 2a 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e  ** then the tran
17ba0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
17bb0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
17bc0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
17bd0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65  ction.  ** inste
17be0 61 64 20 6f 66 20 61 63 74 75 61 6c 6c 79 20 63  ad of actually c
17bf0 6f 6e 63 6c 75 64 65 64 2e 20 41 20 73 75 62 73  oncluded. A subs
17c00 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43  equent call to C
17c10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
17c20 0a 20 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63  .  ** or Rollbac
17c30 6b 28 29 20 77 69 6c 6c 20 66 69 6e 69 73 68 20  k() will finish 
17c40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17c50 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  and unlock the d
17c60 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66  atabase.  */.  f
17c70 6f 72 28 70 43 73 72 3d 70 42 74 2d 3e 70 43 75  or(pCsr=pBt->pCu
17c80 72 73 6f 72 3b 20 70 43 73 72 20 26 26 20 70 43  rsor; pCsr && pC
17c90 73 72 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20 70  sr->pBtree!=p; p
17ca0 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29  Csr=pCsr->pNext)
17cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
17cc0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
17cd0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
17ce0 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
17cf0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
17d00 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20  if( pCsr ){.    
17d10 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
17d20 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
17d30 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
17d40 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
17d50 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
17d60 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
17d70 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
17d80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
17d90 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
17da0 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
17db0 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
17dc0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
17dd0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
17de0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
17df0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
17e00 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
17e10 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
17e20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
17e30 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
17e40 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
17e50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
17e60 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
17e70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
17e80 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
17e90 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
17ea0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
17eb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
17ec0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
17ed0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
17ee0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
17ef0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
17f00 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
17f10 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
17f20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
17f30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
17f40 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
17f50 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
17f60 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
17f70 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
17f80 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
17f90 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
17fa0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17fb0 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
17fc0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
17fd0 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
17fe0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
17ff0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
18000 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
18010 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
18020 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
18030 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
18040 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18050 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
18060 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
18070 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
18080 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
18090 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
180a0 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
180b0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
180c0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
180d0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
180e0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
180f0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18100 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
18110 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18120 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
18130 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
18140 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
18150 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
18160 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
18170 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
18180 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
18190 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
181a0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
181b0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
181c0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
181d0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
181e0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
181f0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
18200 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
18210 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
18220 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
18230 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
18240 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
18250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
18260 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
18270 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
18280 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
18290 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
182a0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
182b0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
182c0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
182d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
182e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
182f0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
18300 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18310 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
18320 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18330 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
18340 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
18350 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
18360 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
18370 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
18380 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
18390 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
183a0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
183b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
183c0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
183d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
183e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
183f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
18400 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18410 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18420 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
18430 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
18440 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
18450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18460 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
18470 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
18480 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
184a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
184b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
184c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
184d0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
184e0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
184f0 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
18500 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
18510 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18520 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18540 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
18550 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
18560 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18570 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
18580 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
18590 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
185a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
185b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
185c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
185d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
185e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
185f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
18600 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
18610 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18620 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
18640 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
18650 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18660 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
18670 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
18680 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
18690 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
186a0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
186b0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
186c0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
186d0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
186e0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
186f0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
18700 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
18710 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
18720 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
18730 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
18740 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
18750 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
18760 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
18770 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
18780 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
18790 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
187a0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
187b0 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
187c0 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
187d0 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
187e0 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
187f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
18800 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
18810 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
18820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
18830 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
18840 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
18850 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
18860 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
18870 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
18880 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
18890 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
188a0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
188b0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
188c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
188d0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
188e0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
188f0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
18900 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
18910 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
18920 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
18930 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
18940 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
18950 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
18960 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
18970 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
18980 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
18990 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
189a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
189b0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
189c0 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
189d0 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
189e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
189f0 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
18a00 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
18a10 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
18a20 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
18a30 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
18a40 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
18a50 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
18a60 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
18a70 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
18a80 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
18a90 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
18aa0 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
18ab0 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
18ac0 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
18ad0 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
18ae0 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
18af0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
18b00 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
18b10 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
18b20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
18b30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
18b40 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
18b50 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
18b60 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
18b70 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
18b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18b90 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
18ba0 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
18bb0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
18bc0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
18bd0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
18be0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
18bf0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
18c00 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
18c10 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
18c20 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
18c30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
18c40 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
18c50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18c60 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
18c70 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
18c80 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
18c90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18ca0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
18cb0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
18cc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18cd0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
18ce0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
18cf0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
18d00 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
18d10 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
18d20 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
18d30 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
18d40 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
18d50 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
18d60 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
18d70 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
18d80 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
18d90 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
18da0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
18db0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
18dc0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
18dd0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
18de0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
18df0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
18e00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18e10 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
18e20 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
18e30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18e40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
18e50 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
18e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18e70 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
18e80 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
18e90 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
18ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
18eb0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
18ec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18ed0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
18ee0 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
18ef0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
18f00 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
18f10 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
18f20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
18f30 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
18f40 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
18f50 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
18f60 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
18f70 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
18f80 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
18f90 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
18fa0 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
18fb0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
18fc0 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
18fd0 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
18fe0 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
18ff0 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
19000 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
19010 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
19020 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
19030 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
19040 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
19050 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
19060 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
19070 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
19080 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
19090 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
190a0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
190b0 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
190c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
190d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
190e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
190f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19100 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
19110 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
19120 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
19130 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
19140 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
19150 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19160 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
19170 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
19180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19190 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
191a0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
191b0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
191c0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
191d0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
191e0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
191f0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
19200 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
19210 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
19220 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
19230 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
19240 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
19250 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
19260 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
19270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19280 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19290 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
192a0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
192b0 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
192c0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
192d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
192e0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
192f0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
19300 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
19310 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19320 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19330 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
19340 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
19350 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
19360 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
19370 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
19380 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
19390 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
193a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
193b0 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
193c0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
193d0 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
193e0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
193f0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
19400 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
19410 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
19420 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
19430 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
19440 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
19450 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
19460 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
19470 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
19480 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
19490 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
194a0 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
194b0 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
194c0 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
194d0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
194e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
194f0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
19500 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
19510 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
19520 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
19530 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
19540 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
19550 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
19560 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19570 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
19580 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
19590 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
195a0 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
195b0 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
195c0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
195d0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
195e0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
195f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
19600 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
19610 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
19620 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
19630 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
19640 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
19650 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
19660 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
19670 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
19680 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
19690 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
196a0 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
196b0 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
196c0 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
196d0 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
196e0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
196f0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
19700 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
19710 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
19720 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
19730 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
19740 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
19750 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
19760 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19770 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19780 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
19790 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
197a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
197b0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
197c0 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
197d0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
197e0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
197f0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
19800 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
19810 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
19820 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
19830 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
19840 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
19850 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
19860 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
19870 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
19880 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19890 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
198a0 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
198b0 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
198c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
198d0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
198e0 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
198f0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
19900 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
19910 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
19920 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
19930 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
19940 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
19950 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
19960 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
19970 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
19980 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
19990 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
199a0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
199b0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
199c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
199d0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
199e0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
199f0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
19a00 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
19a10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19a20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19a30 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
19a40 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
19a50 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
19a60 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
19a70 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
19a80 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
19a90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
19aa0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
19ab0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
19ac0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
19ad0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
19ae0 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
19af0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
19b00 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
19b10 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
19b20 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
19b30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
19b40 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
19b50 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
19b60 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
19b70 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
19b80 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
19b90 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
19ba0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
19bb0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
19bc0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
19bd0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
19be0 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
19bf0 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
19c00 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
19c10 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
19c20 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
19c30 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
19c40 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
19c50 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
19c60 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
19c70 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
19c80 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
19c90 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
19ca0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19cb0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
19cc0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19cd0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
19ce0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
19d00 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
19d10 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
19d20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
19d30 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
19d40 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
19d50 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
19d60 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
19d70 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
19d80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19d90 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
19da0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
19db0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
19dc0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
19dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19df0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
19e00 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
19e10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19e20 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
19e30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19e40 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
19e50 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
19e60 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
19e70 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
19e80 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
19e90 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
19ea0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
19eb0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
19ec0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
19ed0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
19ee0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
19ef0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
19f00 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
19f10 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
19f20 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
19f30 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
19f40 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
19f50 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
19f60 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
19f70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
19f80 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
19f90 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
19fa0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
19fb0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
19fc0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
19fd0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
19fe0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
19ff0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
1a000 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
1a010 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
1a020 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
1a030 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
1a040 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
1a050 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
1a060 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
1a070 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
1a080 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
1a090 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
1a0a0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
1a0b0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
1a0c0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
1a0d0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
1a0e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1a0f0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
1a100 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
1a110 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
1a120 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
1a130 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
1a140 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
1a150 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
1a160 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
1a170 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
1a180 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
1a190 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
1a1a0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
1a1b0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
1a1c0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
1a1d0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
1a1e0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
1a1f0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1a200 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1a210 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
1a220 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
1a230 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
1a240 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
1a250 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
1a260 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
1a270 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1a280 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
1a290 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
1a2a0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
1a2b0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
1a2c0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
1a2d0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
1a2e0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
1a2f0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
1a300 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
1a310 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
1a320 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
1a330 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
1a340 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1a350 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
1a360 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
1a370 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
1a380 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
1a390 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1a3a0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1a3b0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1a3c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1a3f0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1a420 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1a430 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1a440 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1a470 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1a480 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1a490 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a4b0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1a4c0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1a4d0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1a4e0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1a4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1a500 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1a510 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1a520 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a530 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a540 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1a550 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1a560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1a570 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1a580 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1a590 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1a5a0 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1a5b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1a5c0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1a5d0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1a5e0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1a5f0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1a600 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1a610 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1a620 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1a630 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1a640 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1a650 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1a660 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1a670 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1a680 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1a690 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1a6a0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1a6b0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1a6c0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1a6d0 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1a6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1a6f0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1a700 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1a710 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1a720 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1a730 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1a740 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1a750 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1a760 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1a770 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1a780 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1a790 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1a7a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1a7c0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1a7d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1a7e0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1a7f0 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72  wrFlag && pBt->r
1a800 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
1a810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1a820 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1a830 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70  ( iTable==1 && p
1a840 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1a850 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
1a860 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  urn SQLITE_EMPTY
1a870 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1a880 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1a890 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1a8a0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1a8b0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1a8c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1a8d0 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1a8e0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1a8f0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1a900 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1a910 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1a920 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1a930 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1a940 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1a950 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1a960 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1a970 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1a980 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1a990 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1a9a0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1a9b0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1a9c0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1a9d0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1a9e0 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1a9f0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1aa00 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1aa10 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1aa20 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
1aa30 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1aa40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1aa50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1aa60 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1aa70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1aaa0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1aab0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aad0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1aae0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1aaf0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1ab00 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1ab30 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1ab40 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1ab50 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab70 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1ab80 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1ab90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1abc0 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1abd0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1abe0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1abf0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1ac00 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1ac10 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1ac20 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1ac30 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1ac40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1ac50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ac60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1ac70 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1ac80 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1ac90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1aca0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1acb0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1acc0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1acd0 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1ace0 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1acf0 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1ad00 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1ad10 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1ad20 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1ad30 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1ad40 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1ad50 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1ad60 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1ad70 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1ad80 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1ad90 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1ada0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
1adb0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
1adc0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1add0 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1ade0 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1adf0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1ae00 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1ae10 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1ae20 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1ae30 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1ae40 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1ae50 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1ae60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1ae70 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1ae80 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1ae90 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1aea0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1aeb0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1aec0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1aed0 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1aee0 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1aef0 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1af00 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1af10 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1af20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1af30 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1af40 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1af50 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1af60 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1af70 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1af80 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1af90 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1afa0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1afb0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1afc0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1afd0 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1afe0 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1aff0 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1b000 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1b010 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1b020 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1b030 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1b040 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1b050 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1b060 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1b070 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1b080 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1b090 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1b0a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1b0b0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1b0c0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1b0d0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1b0e0 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1b0f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1b100 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1b110 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1b120 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1b130 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1b140 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1b150 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1b160 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1b170 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1b180 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1b190 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1b1a0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1b1b0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1b1c0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1b1d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1b1e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1b1f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1b200 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1b210 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1b220 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1b230 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1b240 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1b250 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1b260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b270 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1b280 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1b290 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1b2a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b2b0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1b2c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b2d0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1b2e0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1b2f0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1b300 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1b310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b320 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1b330 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b340 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1b350 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1b360 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1b370 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1b380 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1b390 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1b3a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1b3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1b3c0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1b3d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1b3e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1b3f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1b400 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1b410 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1b420 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1b430 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1b440 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1b450 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1b460 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1b470 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1b480 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1b490 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1b4a0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1b4b0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1b4c0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1b4d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b4e0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1b4f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b500 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b510 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1b520 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1b530 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1b540 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1b550 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1b560 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1b570 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1b580 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1b590 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1b5a0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1b5b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1b5c0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1b5d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1b5e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1b5f0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1b600 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1b610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1b620 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1b630 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1b640 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1b650 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1b660 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1b670 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1b680 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1b690 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1b6a0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1b6b0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1b6c0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1b6d0 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1b6e0 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1b6f0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1b700 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1b710 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1b720 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1b730 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1b740 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1b750 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1b760 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1b770 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1b780 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1b790 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1b7a0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1b7b0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1b7c0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1b7d0 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1b7e0 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1b7f0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1b800 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1b810 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1b820 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1b830 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1b840 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1b850 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1b860 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1b870 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1b880 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1b890 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1b8a0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1b8b0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1b8c0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1b8d0 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1b8e0 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1b8f0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1b900 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1b910 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1b920 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1b930 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1b940 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1b950 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1b960 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1b970 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1b980 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1b990 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1b9a0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1b9b0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1b9c0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1b9d0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1b9e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1b9f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1ba00 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1ba10 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1ba20 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1ba30 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1ba40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba50 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ba60 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1ba70 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1ba80 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1ba90 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1baa0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1bab0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1bac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1bad0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1bae0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1baf0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1bb30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1bb40 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1bb80 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1bb90 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1bbd0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1bbe0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1bbf0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1bc00 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1bc10 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1bc20 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
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 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1bcc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd00 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1bd10 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1bd20 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
1bd30 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
1bd40 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
1bd50 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
1bd60 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
1bd70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
1bd80 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
1bd90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1bda0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
1bdb0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
1bdc0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
1bdd0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
1bde0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
1bdf0 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
1be00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1be10 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
1be20 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
1be30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1be40 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
1be50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1be60 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1be70 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1be80 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
1be90 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1bea0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1beb0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1bec0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1bed0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1bee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bef0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1bf00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1bf10 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
1bf20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1bf30 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
1bf40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1bf50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1bf60 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1bf70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1bf80 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1bf90 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
1bfa0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1bfb0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
1bfc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bfd0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1bfe0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1bff0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1c000 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1c010 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1c020 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1c030 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
1c040 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
1c050 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1c060 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
1c070 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
1c080 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
1c090 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
1c0a0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
1c0b0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
1c0c0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1c0d0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
1c0e0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1c0f0 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
1c100 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1c110 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c120 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1c130 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1c140 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c150 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1c160 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1c170 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1c180 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1c1a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1c1b0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1c1c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1c1d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1c1e0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1c1f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1c200 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1c210 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
1c220 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
1c230 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
1c240 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
1c250 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
1c260 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
1c270 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1c280 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1c290 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
1c2a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c2b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
1c2c0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
1c2d0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
1c2e0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
1c2f0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
1c300 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
1c310 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
1c320 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1c330 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
1c340 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
1c350 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
1c360 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
1c370 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
1c380 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
1c390 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
1c3a0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
1c3b0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
1c3c0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
1c3d0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
1c3e0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1c3f0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
1c400 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c410 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1c420 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
1c430 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1c440 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1c450 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
1c460 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
1c470 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
1c480 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
1c490 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1c4a0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
1c4b0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
1c4c0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
1c4d0 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
1c4e0 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
1c4f0 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
1c500 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
1c510 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
1c520 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
1c530 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
1c540 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
1c550 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1c560 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1c570 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
1c580 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
1c590 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1c5a0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
1c5b0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
1c5c0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
1c5d0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
1c5e0 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
1c5f0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
1c600 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
1c610 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
1c620 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1c630 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
1c640 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
1c650 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1c660 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
1c670 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
1c680 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
1c690 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1c6a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1c6b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c6c0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6e0 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
1c6f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1c700 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
1c710 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
1c720 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
1c730 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
1c740 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
1c750 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
1c760 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
1c770 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1c780 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
1c790 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
1c7a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1c7b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1c7c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1c7d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c7e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1c7f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c800 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
1c810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c820 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1c830 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
1c840 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1c850 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1c860 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
1c870 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
1c880 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
1c890 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
1c8a0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
1c8b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1c8c0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
1c8d0 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
1c8e0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
1c8f0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
1c900 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
1c910 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
1c920 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
1c930 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
1c940 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
1c950 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
1c960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1c970 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1c980 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
1c990 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
1c9a0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
1c9b0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
1c9c0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1c9d0 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
1c9e0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
1c9f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ca00 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
1ca10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ca20 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61   iGuess<=pagerPa
1ca30 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
1ca40 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1ca50 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
1ca60 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
1ca70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1ca80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
1ca90 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1caa0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
1cab0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
1cac0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
1cad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cae0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
1caf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1cb00 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
1cb10 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
1cb20 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
1cb30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cb40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1cb50 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
1cb60 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   &pPage, 0);.   
1cb70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1cb80 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
1cb90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
1cba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cbb0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
1cbc0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1cbd0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
1cbe0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
1cbf0 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
1cc00 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
1cc10 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
1cc20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
1cc30 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
1cc40 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1cc50 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
1cc60 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
1cc70 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
1cc80 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
1cc90 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
1cca0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
1ccb0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
1ccc0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
1ccd0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
1cce0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1ccf0 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
1cd00 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
1cd10 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
1cd20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
1cd30 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
1cd40 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
1cd50 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
1cd60 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
1cd70 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
1cd80 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
1cd90 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1cda0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
1cdb0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
1cdc0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1cdd0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
1cde0 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
1cdf0 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
1ce00 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ce10 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
1ce20 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
1ce30 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1ce40 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
1ce50 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
1ce60 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1ce70 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
1ce80 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
1ce90 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1cea0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ceb0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
1cec0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
1ced0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cee0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
1cef0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
1cf20 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
1cf30 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
1cf40 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
1cf50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1cf60 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
1cf70 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
1cf80 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
1cf90 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1cfa0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
1cfb0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
1cfc0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
1cfd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1cfe0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1cff0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d010 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d020 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1d030 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
1d040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1d050 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1d060 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
1d070 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
1d080 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
1d090 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
1d0a0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
1d0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d0d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1d0e0 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
1d0f0 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
1d100 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
1d110 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1d120 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
1d130 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
1d140 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
1d150 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
1d160 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
1d170 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
1d180 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
1d190 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
1d1a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
1d1b0 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
1d1c0 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
1d1d0 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
1d1e0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
1d1f0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
1d200 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
1d210 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
1d220 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
1d230 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
1d240 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1d250 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
1d260 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
1d270 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
1d280 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
1d290 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
1d2a0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
1d2b0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
1d2c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
1d2d0 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
1d2e0 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1d2f0 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
1d300 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
1d310 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
1d320 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
1d330 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
1d340 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
1d350 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
1d360 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
1d370 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
1d380 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
1d390 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
1d3a0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
1d3b0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1d3c0 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
1d3d0 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
1d3e0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
1d3f0 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
1d400 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
1d410 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1d420 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1d430 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1d440 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
1d450 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
1d460 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
1d470 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
1d480 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
1d490 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
1d4a0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
1d4b0 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
1d4c0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
1d4d0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
1d4e0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
1d4f0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
1d500 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
1d510 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1d520 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
1d530 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1d540 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
1d550 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
1d560 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
1d570 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
1d580 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
1d590 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
1d5a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
1d5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d5c0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
1d5d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d5e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1d5f0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1d600 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1d610 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
1d620 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1d630 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
1d640 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
1d650 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
1d660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
1d670 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1d680 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1d690 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
1d6a0 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
1d6b0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
1d6c0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
1d6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
1d6e0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
1d6f0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
1d700 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
1d710 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
1d720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d730 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
1d740 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
1d750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d760 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1d770 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
1d780 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
1d790 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
1d7a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d7b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7d0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
1d7e0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
1d7f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d800 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
1d810 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1d820 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1d830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1d840 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1d850 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1d860 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d870 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d880 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
1d890 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
1d8a0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
1d8b0 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
1d8c0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1d8d0 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
1d8e0 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e  intKey ? 0 : (in
1d8f0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
1d900 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  y);..  if( NEVER
1d910 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b  (offset+amt > nK
1d920 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
1d930 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61  ata) .   || &aPa
1d940 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1d950 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
1d960 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
1d970 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
1d980 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
1d990 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
1d9a0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1d9b0 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
1d9c0 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
1d9d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d9e0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1d9f0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
1da00 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
1da10 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
1da20 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
1da30 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
1da40 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
1da50 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
1da60 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
1da70 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
1da80 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1da90 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
1daa0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
1dab0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
1dac0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1dad0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
1dae0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1daf0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1db00 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
1db10 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
1db20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1db30 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
1db40 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
1db50 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
1db60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db70 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1db80 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
1db90 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1dba0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
1dbb0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
1dbc0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
1dbd0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
1dbe0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
1dbf0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
1dc00 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1dc10 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
1dc20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1dc30 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
1dc40 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
1dc50 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1dc60 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
1dc70 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
1dc80 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
1dc90 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
1dca0 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
1dcb0 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
1dcc0 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
1dcd0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
1dce0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dcf0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
1dd00 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
1dd10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1dd20 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1dd30 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
1dd40 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
1dd50 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
1dd60 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
1dd70 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
1dd80 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
1dd90 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
1dda0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
1ddb0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
1ddc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ddd0 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
1dde0 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
1ddf0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1de00 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
1de10 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
1de20 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
1de30 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
1de40 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
1de50 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1de60 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
1de70 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
1de80 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
1de90 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76  l);.      /* nOv
1dea0 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73  fl is always pos
1deb0 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77 65  itive.  If it we
1dec0 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61  re zero, fetchPa
1ded0 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65  yload would have
1dee0 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75  .      ** been u
1def0 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
1df00 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  his routine. */.
1df10 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1df20 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72  (nOvfl) && !pCur
1df30 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1df40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1df50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1df60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1df70 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
1df80 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1df90 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1dfa0 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
1dfb0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1dfc0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
1dfd0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1dfe0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
1dff0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
1e000 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
1e010 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1e020 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1e030 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
1e040 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
1e050 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
1e060 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
1e070 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
1e080 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
1e090 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
1e0a0 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
1e0b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1e0c0 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
1e0d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1e0e0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
1e0f0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
1e100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1e110 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
1e120 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
1e130 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
1e140 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1e150 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
1e160 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e170 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e180 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
1e190 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
1e1a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1e1b0 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
1e1c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
1e1d0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
1e1e0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
1e1f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
1e200 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
1e210 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
1e220 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
1e230 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
1e240 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
1e250 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1e260 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
1e270 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1e280 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1e290 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
1e2a0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
1e2b0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
1e2c0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
1e2d0 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
1e2e0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
1e2f0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
1e300 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
1e310 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
1e320 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
1e330 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
1e340 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
1e350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e360 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1e370 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1e380 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1e390 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1e3a0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
1e3b0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1e3c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1e3d0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
1e3e0 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
1e3f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
1e400 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
1e410 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
1e420 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1e430 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
1e440 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
1e450 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
1e460 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
1e470 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
1e480 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
1e490 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1e4a0 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
1e4b0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
1e4c0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
1e4d0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
1e4e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e4f0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1e500 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
1e510 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
1e520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e530 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
1e540 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
1e550 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1e560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
1e580 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
1e590 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
1e5a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e5b0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
1e5c0 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
1e5d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
1e5e0 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
1e5f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1e600 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
1e610 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1e620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e630 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
1e640 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
1e650 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
1e660 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
1e670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e680 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
1e690 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
1e6a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
1e6b0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1e6c0 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
1e6d0 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
1e6e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e6f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e700 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1e710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e720 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
1e750 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
1e760 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1e770 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1e780 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1e790 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1e7a0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1e7b0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1e7c0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1e7d0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1e7e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1e7f0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1e800 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1e810 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1e820 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1e830 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1e840 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1e850 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1e860 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1e870 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1e880 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
1e890 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1e8a0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1e8b0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1e8c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1e8d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e8e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e8f0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1e900 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1e910 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1e930 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e940 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e960 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1e970 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e980 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1e990 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61    if( pCur->apPa
1e9a0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
1e9b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e9c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e9d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
1e9e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1e9f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1ea00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ea10 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1ea20 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
1ea30 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1ea40 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
1ea50 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
1ea60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1ea70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ea80 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1ea90 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1eaa0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1eab0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1eac0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1ead0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1eae0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1eaf0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1eb00 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1eb10 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1eb20 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1eb30 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1eb40 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1eb50 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1eb60 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1eb70 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1eb80 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1eb90 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1eba0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1ebb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ebc0 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
1ebd0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1ebe0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1ebf0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1ec00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ec10 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1ec20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
1ec30 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1ec40 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1ec50 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
1ec60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1ec70 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ec80 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ec90 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1eca0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1ecb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ecc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1ecd0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ece0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ecf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ed00 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1ed10 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1ed20 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1ed30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ed40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ed50 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1ed60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1ed70 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1ed80 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1ed90 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1eda0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
1edb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1edc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1edd0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
1ede0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
1edf0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
1ee00 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
1ee10 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1ee20 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
1ee30 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
1ee40 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
1ee50 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
1ee60 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
1ee70 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1ee80 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
1ee90 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
1eea0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1eeb0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
1eec0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
1eed0 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
1eee0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
1eef0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
1ef00 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
1ef10 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
1ef20 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
1ef30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
1ef40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
1ef50 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
1ef60 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
1ef70 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
1ef80 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
1ef90 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
1efa0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
1efb0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
1efc0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
1efd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1efe0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
1eff0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
1f000 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
1f010 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
1f020 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
1f030 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
1f040 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
1f050 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
1f060 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
1f070 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
1f080 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
1f090 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
1f0a0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
1f0b0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
1f0c0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1f0d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
1f0e0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
1f0f0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
1f100 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
1f110 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1f120 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
1f130 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
1f140 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
1f150 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
1f160 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
1f170 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1f180 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
1f190 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
1f1a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1f1b0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1f1c0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1f1d0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1f1e0 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
1f1f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f200 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1f210 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
1f220 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
1f230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
1f240 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
1f250 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1f260 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
1f270 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1f280 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
1f290 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
1f2a0 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
1f2b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
1f2c0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
1f2d0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1f2e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f2f0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
1f300 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f310 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1f320 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f330 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f340 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1f350 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f360 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1f370 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1f380 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1f390 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1f3a0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f3b0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f3c0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1f3d0 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1f3e0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1f3f0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1f400 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1f410 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f420 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1f430 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1f440 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1f450 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1f460 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1f470 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1f480 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1f490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1f4a0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1f4b0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1f4c0 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1f4d0 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1f4e0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1f4f0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1f500 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1f510 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1f520 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1f530 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1f540 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1f550 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1f560 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1f570 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1f580 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1f590 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1f5a0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1f5b0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1f5c0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1f5d0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1f5e0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1f5f0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1f600 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1f610 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1f620 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1f630 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1f640 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1f650 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1f660 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1f670 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1f680 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1f690 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1f6a0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1f6b0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1f6c0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1f6d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1f6e0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1f6f0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1f700 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1f710 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1f720 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1f730 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1f740 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1f750 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1f760 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1f770 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1f780 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1f790 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1f7a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1f7b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1f7c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1f7d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f7e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f7f0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1f800 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f810 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1f820 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1f830 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1f840 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
1f850 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1f860 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
1f870 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
1f880 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1f890 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1f8a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f8b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1f8c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1f8d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1f8e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f8f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1f900 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f910 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1f920 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1f930 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1f940 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1f950 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
1f960 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
1f970 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1f980 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
1f990 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
1f9a0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
1f9b0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
1f9c0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
1f9d0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
1f9e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
1f9f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
1fa00 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1fa10 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
1fa20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
1fa30 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
1fa40 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
1fa50 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
1fa60 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
1fa70 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
1fa80 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
1fa90 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
1faa0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
1fab0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
1fac0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
1fad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1fae0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
1faf0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
1fb00 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
1fb10 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
1fb20 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
1fb30 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
1fb40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fb50 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
1fb60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1fb70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1fb80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1fb90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fba0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1fbb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
1fbc0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
1fbd0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
1fbe0 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
1fbf0 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
1fc00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fc10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1fc20 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
1fc30 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
1fc40 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
1fc50 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1fc60 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
1fc70 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
1fc80 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1fc90 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
1fca0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
1fcb0 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
1fcc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1fcd0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1fce0 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
1fcf0 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
1fd00 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
1fd10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
1fd20 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
1fd30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fd40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1fd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd60 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
1fd70 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
1fd80 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
1fd90 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
1fda0 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
1fdb0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
1fdc0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
1fdd0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1fde0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
1fdf0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
1fe00 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
1fe10 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
1fe20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
1fe30 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1fe40 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
1fe50 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
1fe60 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1fe70 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
1fe80 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
1fe90 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1fea0 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
1feb0 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
1fec0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
1fed0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
1fee0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
1fef0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1ff00 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
1ff10 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1ff20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1ff30 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1ff40 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1ff50 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
1ff60 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
1ff70 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1ff80 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1ff90 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
1ffa0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
1ffb0 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
1ffc0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1ffd0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
1ffe0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1fff0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
20000 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
20010 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
20020 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
20030 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
20040 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
20050 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
20060 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
20070 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
20080 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
20090 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
200a0 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
200b0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
200c0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
200d0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
200e0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
200f0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
20100 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
20110 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
20120 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20130 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20140 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20150 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20170 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
20180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20190 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
201a0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
201b0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
201c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
201d0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
201e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
201f0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
20200 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20210 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
20220 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  .  );.  releaseP
20230 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
20240 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
20250 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
20260 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
20270 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
20280 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
20290 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
202a0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
202b0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
202c0 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
202d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
202e0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
202f0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
20300 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
20310 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
20320 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
20330 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
20340 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
20350 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
20360 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
20370 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
20380 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
20390 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
203a0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
203b0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
203c0 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
203d0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
203e0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
203f0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
20400 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
20410 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
20420 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
20430 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
20440 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
20450 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
20460 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
20470 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
20480 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
20490 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
204a0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
204b0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
204c0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
204d0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
204e0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
204f0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
20500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20510 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
20520 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
20530 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
20540 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
20550 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
20560 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
20570 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
20580 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
20590 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
205a0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
205b0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
205c0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
205d0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
205e0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
205f0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
20600 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
20610 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
20620 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
20630 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
20640 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
20650 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
20660 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
20670 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
20680 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
20690 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
206a0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
206b0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
206c0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
206d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
206e0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
206f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20700 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
20710 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
20720 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20730 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
20740 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20750 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20760 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
20770 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
20780 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
20790 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
207a0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
207b0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
207c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
207d0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
207e0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
207f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
20800 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
20810 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
20820 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20830 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
20840 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20850 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
20860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
20870 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
20880 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
20890 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
208a0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
208b0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
208c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
208d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
208e0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75   for(i=1; i<=pCu
208f0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
20900 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20910 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
20920 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ]);.    }.    pC
20930 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
20940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20950 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
20960 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
20970 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
20980 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  ge[0]);.    if( 
20990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
209a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
209b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
209c0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
209d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
209e0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
209f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75  ;..    /* If pCu
20a00 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
20a10 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
20a20 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
20a30 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
20a40 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64  .    ** expected
20a50 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
20a60 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
20a70 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
20a80 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a  eyInfo is.    **
20a90 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
20aa0 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
20ab0 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
20ac0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
20ad0 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e,.    ** return
20ae0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
20af0 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  PT error.  */.  
20b00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20b10 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
20b20 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70  y==1 || pCur->ap
20b30 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
20b40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
20b50 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
20b60 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  )!=pCur->apPage[
20b70 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
20b80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20b90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20ba0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20bb0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
20bc0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20  root page is of 
20bd0 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
20be0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74  . This must be t
20bf0 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20  he.  ** case as 
20c00 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  the call to this
20c10 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
20c20 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70  oaded the root-p
20c30 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a  age (either.  **
20c40 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20   this call or a 
20c50 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74  previous invocat
20c60 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20  ion) would have 
20c70 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
20c80 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  ion .  ** if the
20c90 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65   assumption were
20ca0 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69   not true, and i
20cb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
20cc0 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20  e for the flags 
20cd0 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61  .  ** byte to ha
20ce0 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
20cf0 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73   while this curs
20d00 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  or is holding a 
20d10 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74  reference.  ** t
20d20 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  o the page.  */.
20d30 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
20d40 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
20d50 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
20d60 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
20d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
20d80 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28  oot->isInit && (
20d90 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
20da0 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)==pRoot->intKe
20db0 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69  y );..  pCur->ai
20dc0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
20dd0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
20de0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
20df0 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
20e00 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
20e10 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
20e20 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
20e30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
20e40 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
20e50 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
20e60 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
20e70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20e80 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
20e90 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
20ea0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
20eb0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
20ec0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
20ed0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
20ee0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20ef0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
20f00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
20f10 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
20f20 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
20f30 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
20f40 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
20f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20f60 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
20f70 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
20f80 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
20f90 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
20fa0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
20fb0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
20fc0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
20fd0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
20fe0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
20ff0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
21000 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
21010 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
21020 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
21030 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
21040 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
21050 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
21060 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
21070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21080 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
21090 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
210a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
210b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
210c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
210d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
210e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
210f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
21100 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21110 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
21120 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
21130 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21140 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
21150 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
21160 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
21170 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
21180 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21190 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
211a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
211b0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
211c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
211d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
211e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
211f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
21200 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
21210 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
21220 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
21230 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
21240 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
21250 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
21260 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21270 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
21280 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
21290 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
212a0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
212b0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
212c0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
212d0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
212e0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
212f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
21300 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
21310 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
21320 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
21330 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
21340 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
21350 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
21360 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
21370 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
21380 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
21390 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
213a0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
213b0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
213c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
213d0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
213e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
213f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21400 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21410 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21420 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21430 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21440 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
21450 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21460 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
21470 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
21480 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21490 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
214a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
214b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
214c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
214d0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
214e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
214f0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
21500 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
21520 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21530 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
21540 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
21550 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
21560 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
21570 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
21580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21590 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
215a0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
215b0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
215c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
215d0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
215e0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
215f0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
21600 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
21610 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
21620 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
21630 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
21640 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
21650 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
21660 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
21670 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
21680 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
21690 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
216a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
216b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
216c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
216d0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
216e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
216f0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
21700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21710 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
21720 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21730 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
21740 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
21750 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21760 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
21770 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
21780 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
21790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
217a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
217b0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
217c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
217d0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
217e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
217f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
21800 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
21810 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21820 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
21830 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
21840 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
21850 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
21860 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
21870 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
21880 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
21890 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
218a0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
218b0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
218c0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
218d0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
218e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
218f0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
21900 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
21910 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
21920 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21930 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21940 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
21950 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21960 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
21970 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
21980 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
21990 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
219a0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
219b0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
219c0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
219d0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
219e0 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72  ->eState && pCur
219f0 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64  ->atLast ){.#ifd
21a00 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21a10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
21a20 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
21a30 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
21a40 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
21a50 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
21a60 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
21a70 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
21a80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
21a90 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
21aa0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
21ab0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
21ac0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
21ad0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
21ae0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
21af0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21b00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21b10 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
21b20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21b30 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
21b40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
21b50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21b60 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
21b70 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
21b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21b90 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
21ba0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
21bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21bc0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
21bd0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
21be0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
21bf0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21c00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21c10 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
21c20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
21c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21c50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21c60 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
21c70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
21c80 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
21c90 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
21ca0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63  Cur->atLast = rc
21cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30  ==SQLITE_OK ?1:0
21cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
21ce0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
21cf0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
21d00 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
21d10 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
21d20 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
21d30 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
21d40 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
21d50 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
21d60 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
21d70 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
21d80 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
21d90 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
21da0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
21db0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
21dc0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
21dd0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
21de0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
21df0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
21e00 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
21e10 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
21e20 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
21e30 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
21e40 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
21e50 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
21e60 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
21e70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
21e80 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
21e90 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
21ea0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
21eb0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
21ec0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
21ed0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
21ee0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
21ef0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
21f00 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
21f10 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
21f20 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
21f30 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
21f40 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
21f50 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
21f60 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
21f70 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
21f80 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
21f90 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
21fa0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
21fb0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21fc0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
21fd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21fe0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
21ff0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
22000 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
22010 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
22030 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
22040 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
22050 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
22060 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
22070 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
22080 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
22090 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
220a0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
220b0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
220c0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
220d0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
220e0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
220f0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
22100 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22110 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
22140 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
22150 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
22160 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
22170 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
22180 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
22190 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
221a0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
221b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
221c0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
221d0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
221e0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22200 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
22210 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
22220 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
22230 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
22240 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
22250 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
22260 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
22270 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22280 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
22290 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
222a0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
222b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
222c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
222d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
222e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
222f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
22300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
22310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
22320 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
22330 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
22340 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
22350 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
22360 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
22370 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
22380 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
22390 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
223a0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
223b0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
223c0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
223d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
223e0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
223f0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
22400 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22410 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
22420 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
22430 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
22440 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
22450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
22470 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
22480 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
22490 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
224a0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
224b0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
224c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
224d0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
224e0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
224f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22510 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22520 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22530 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
22540 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22550 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
22560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22570 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22580 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
22590 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
225a0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
225b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
225c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
225d0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
225e0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
225f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22600 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22610 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
22620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22630 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
22640 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
22650 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
22660 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
22670 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
22680 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
22690 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
226a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
226b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
226c0 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  ge];.    int c;.
226d0 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
226e0 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
226f0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
22700 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
22710 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
22720 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
22730 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
22740 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
22750 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
22760 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
22770 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
22780 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
22790 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
227a0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
227b0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
227c0 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
227d0 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
227e0 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
227f0 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
22800 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
22810 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
22820 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
22830 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
22840 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
22850 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
22860 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
22870 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
22880 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
22890 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
228a0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
228b0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
228c0 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
228d0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
228e0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
228f0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
22900 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
22910 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22920 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22930 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73  16)upr;.    }els
22940 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
22950 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22960 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c  ] = (u16)((upr+l
22970 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  wr)/2);.    }.  
22980 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
22990 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
229a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
229b0 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66  ge]; /* Index of
229c0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
229d0 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20   pPage */.      
229e0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22a10 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
22a20 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
22a30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
22a40 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
22a50 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
22a60 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
22a70 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
22a80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
22a90 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
22aa0 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
22ab0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
22ac0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
22ad0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
22ae0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
22af0 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
22b00 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
22b10 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
22b20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
22b30 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
22b40 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
22b50 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
22b60 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
22b70 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
22b80 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
22b90 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
22ba0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
22bb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22bc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22bd0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
22be0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
22bf0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
22c00 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76  .        pCur->v
22c10 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
22c20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
22c30 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
22c40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
22c60 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
22c70 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37  page-size is 327
22c80 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  68 bytes. This m
22c90 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
22ca0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
22cb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
22cc0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
22cd0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
22ce0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
22cf0 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39  e is at most 819
22d00 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d  8 bytes, which m
22d10 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
22d20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
22d30 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
22d40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22d50 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
22d60 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
22d70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
22d80 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
22d90 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
22da0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
22db0 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
22dc0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
22dd0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
22de0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
22df0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
22e00 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
22e10 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
22e20 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
22e30 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  /.        int nC
22e40 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
22e50 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43          if( !(nC
22e60 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e  ell & 0x80) && n
22e70 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
22e80 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
22e90 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
22ea0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
22eb0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
22ec0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
22ed0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
22ee0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
22ef0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
22f00 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
22f10 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
22f20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
22f30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
22f40 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22f50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22f60 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
22f70 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
22f80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22f90 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
22fa0 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
22fb0 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
22fc0 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
22fd0 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
22fe0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
22ff0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23000 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
23010 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
23020 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
23030 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
23040 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
23050 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
23060 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
23070 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
23080 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
23090 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
230a0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
230b0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
230c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
230d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
230e0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
230f0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
23100 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
23110 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
23120 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
23130 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
23140 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
23150 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
23160 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
23170 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
23180 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
23190 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
231a0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
231b0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
231c0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
231d0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
231e0 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
231f0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
23200 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
23210 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
23220 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
23230 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
23240 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
23250 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
23260 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
23270 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
23280 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
23290 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
232a0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
232b0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
232c0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
232d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
232e0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
232f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23300 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23310 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
23320 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
23330 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23340 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
23350 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
23360 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
23370 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
23380 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23390 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
233a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
233b0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
233c0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
233d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
233e0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
233f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
23400 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
23410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23420 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
23430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
23440 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
23450 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
23460 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
23470 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
23480 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
23490 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
234a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
234b0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
234c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
234d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
234e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
234f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
23500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23510 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
23520 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
23530 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
23540 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
23550 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
23560 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
23570 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
23580 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23590 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
235a0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
235b0 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  )((lwr+upr)/2);.
235c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
235d0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
235e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
235f0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
23600 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
23610 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
23620 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
23630 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
23640 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
23650 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
23660 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
23670 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
23680 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
23690 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
236a0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
236b0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
236c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
236d0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
236e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
236f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23700 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
23710 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23720 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  l );.      *pRes
23730 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
23740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23750 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
23760 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
23770 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23780 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
23790 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
237a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
237b0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
237c0 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
237d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
237e0 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
237f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
23800 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
23810 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
23820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23830 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
23840 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
23850 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
23860 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
23870 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
23880 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
23890 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
238a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
238b0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
238c0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
238d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
238e0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
238f0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
23900 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
23910 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
23920 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
23930 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
23940 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
23950 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
23960 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23970 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
23980 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
23990 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
239a0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
239b0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
239c0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
239d0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
239e0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
239f0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
23a00 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
23a10 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
23a20 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
23a30 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
23a40 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
23a50 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
23a60 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
23a70 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
23a80 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
23a90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
23aa0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
23ab0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
23ac0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
23ad0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
23ae0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
23af0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
23b00 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
23b10 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
23b20 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
23b30 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
23b40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23b50 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
23b60 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
23b70 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
23b80 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
23b90 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
23ba0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23bb0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23bc0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
23bd0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
23be0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
23bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
23c00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23c10 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
23c20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
23c30 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
23c40 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
23c50 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
23c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23c70 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
23c80 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
23c90 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
23ca0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
23cb0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
23cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
23cd0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
23ce0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
23cf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23d00 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
23d10 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
23d20 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
23d30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
23d40 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
23d50 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
23d60 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
23d70 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23d80 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23d90 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
23da0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
23db0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
23dc0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
23dd0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
23de0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
23df0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
23e00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
23e10 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
23e20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23e30 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
23e40 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
23e50 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
23e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
23e80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
23e90 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
23ea0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
23eb0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
23ec0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
23ed0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
23ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
23f00 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
23f10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
23f20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23f30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
23f40 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
23f50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
23f60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
23f70 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
23f80 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
23f90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
23fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
23fb0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
23fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23fe0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
23ff0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
24000 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
24010 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
24020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24030 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
24040 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
24050 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
24060 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
24070 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
24080 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
24090 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
240a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
240b0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
240c0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
240d0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
240e0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
240f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
24100 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
24110 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
24120 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
24130 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
24140 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
24150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24160 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
24170 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
24180 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
24190 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
241a0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
241b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
241c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
241d0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
241e0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
241f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24200 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
24210 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
24220 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
24230 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
24240 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
24250 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
24260 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24270 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
24280 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
24290 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
242a0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
242b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
242c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
242d0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
242e0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
242f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24300 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24310 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
24320 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24330 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
24340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
24350 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
24360 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24370 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24380 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
24390 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
243a0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
243b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
243c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
243d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
243e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
243f0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
24400 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24410 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
24420 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
24430 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
24440 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24450 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
24460 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
24470 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
24480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
244a0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
244b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
244c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
244d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
244e0 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
244f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24500 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
24510 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24520 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24530 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
24540 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
24550 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24570 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
24580 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
24590 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
245a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
245b0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
245c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
245d0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
245e0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
245f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24600 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
24610 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
24620 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
24630 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
24640 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
24650 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
24660 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
24670 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
24680 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
24690 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
246a0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
246b0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
246c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
246d0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
246e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
246f0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
24700 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
24710 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
24720 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
24730 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
24740 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
24750 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
24760 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
24770 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
24780 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
24790 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
247a0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
247b0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
247c0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
247d0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
247e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
247f0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
24800 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
24810 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
24820 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
24830 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
24840 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
24850 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
24860 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
24870 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
24880 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
24890 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
248a0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
248b0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
248c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
248d0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
248e0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
248f0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
24900 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
24910 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
24920 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
24930 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
24940 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
24950 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
24960 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
24970 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
24980 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
24990 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
249a0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
249b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
249c0 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
249d0 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
249e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
249f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
24a00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
24a10 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
24a20 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
24a30 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
24a40 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
24a50 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
24a60 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
24a70 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
24a80 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24a90 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
24aa0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
24ab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
24ac0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
24ad0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
24ae0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
24af0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
24b00 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
24b10 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
24b20 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
24b30 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
24b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24b60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24b70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
24b80 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
24b90 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
24ba0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
24bb0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
24bc0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
24bd0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
24be0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
24bf0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
24c00 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
24c10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24c20 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
24c30 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
24c40 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
24c50 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
24c60 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
24c70 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
24c80 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
24c90 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
24ca0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
24cb0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
24cc0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
24cd0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
24ce0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
24cf0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
24d00 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
24d10 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
24d20 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
24d30 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
24d40 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
24d50 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
24d60 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
24d70 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
24d80 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
24d90 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
24da0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
24db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24dc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
24dd0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
24de0 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
24df0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
24e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
24e10 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
24e20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
24e30 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
24e40 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
24e50 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
24e60 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
24e70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
24e80 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
24e90 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
24ea0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
24eb0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
24ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
24ed0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
24ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
24ef0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
24f00 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
24f10 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
24f20 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
24f30 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
24f40 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
24f50 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
24f60 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
24f70 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
24f80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24f90 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
24fa0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
24fb0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24fc0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
24fd0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
24fe0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
24ff0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
25000 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
25010 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
25020 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
25030 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
25040 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
25050 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
25060 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
25070 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
25080 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
25090 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
250a0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
250b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
250c0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
250d0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
250e0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
250f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
25100 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
25110 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
25120 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
25130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
25140 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
25150 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25160 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
25170 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
25180 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
25190 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
251a0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
251b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
251c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
251d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
251e0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
251f0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
25200 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
25210 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
25220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
25230 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
25240 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25250 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
25260 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
25270 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25280 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
25290 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
252a0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
252b0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
252c0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
252d0 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
252e0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
252f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
25300 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
25310 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
25320 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
25330 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
25340 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
25350 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
25360 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
25370 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
25380 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25390 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
253a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
253b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
253c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
253d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
253e0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
253f0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
25400 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
25410 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
25420 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
25430 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
25440 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
25450 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
25460 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
25470 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
25480 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
25490 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
254a0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
254b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
254c0 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
254d0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
254e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
254f0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
25500 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
25510 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
25520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25530 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25540 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
25550 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25560 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25570 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25580 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
25590 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
255a0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
255b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
255c0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
255d0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
255e0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
255f0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
25600 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
25610 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
25620 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
25630 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
25640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
25650 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
25660 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
25670 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
25680 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
25690 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
256a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
256b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
256c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
256d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
256e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
256f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25700 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
25710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25720 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
25730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
25740 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
25750 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
25760 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
25770 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
25780 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
25790 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
257a0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
257b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
257c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
257d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
257e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
257f0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
25800 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
25810 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
25820 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
25830 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
25840 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
25850 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
25860 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
25870 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
25880 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
25890 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
258a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
258b0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
258c0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
258d0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
258e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
258f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25900 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
25910 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
25920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25930 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25940 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25950 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25970 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
25980 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
25990 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
259a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
259b0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
259c0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
259d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
259e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
259f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
25a00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
25a10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
25a20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
25a30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25a40 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
25a50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
25a60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25a80 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
25a90 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
25aa0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25ab0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25ad0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
25ae0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
25af0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
25b00 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
25b10 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
25b20 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
25b30 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
25b40 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
25b50 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
25b60 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
25b70 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
25b80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25b90 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
25ba0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
25bb0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
25bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
25bd0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25be0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
25bf0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
25c00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
25c10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
25c20 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
25c30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25c40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25c50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25c60 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
25c70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
25c80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
25c90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25ca0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25cb0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
25cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
25cd0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
25ce0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
25cf0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
25d00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25d10 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
25d20 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
25d30 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
25d40 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
25d50 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
25d60 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
25d70 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
25d80 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
25d90 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
25da0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
25db0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
25dc0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
25dd0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
25de0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
25df0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
25e00 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
25e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
25e20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25e30 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
25e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
25e60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25e70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
25e80 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
25e90 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
25ea0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
25eb0 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
25ec0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
25ed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  0;.          dis
25ee0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  t = get4byte(&aD
25ef0 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
25f00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25f10 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
25f20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  -dist;.         
25f30 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
25f40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
25f50 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79   int d2 = get4by
25f60 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
25f70 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
25f80 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30          if( d2<0
25f90 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20   ) d2 = -d2;.   
25fa0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
25fb0 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
25fc0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
25fd0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
25fe0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
25ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
26010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
26020 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
26030 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
26040 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26050 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
26060 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
26070 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
26080 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
26090 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
260a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
260b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
260c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
260d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
260e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
260f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
26100 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
26110 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
26120 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
26130 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
26140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
26150 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
26160 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
26170 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
26180 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
26190 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
261a0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
261b0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
261c0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
261d0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
26200 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
26210 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
26220 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
26230 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
26240 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
26250 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
26260 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
26270 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
26280 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
26290 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
262a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
262b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
262c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
262d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
262e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
262f0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
26300 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
26310 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
26320 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26330 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
26340 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
26350 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
26360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26390 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
263a0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
263b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
263c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
263e0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
263f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
26400 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26410 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
26420 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
26430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
26440 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
26450 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
26460 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
26470 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
26480 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
26490 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
264a0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
264b0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
264c0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
264d0 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
264e0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
264f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
26500 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
26510 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e  (pBt);.    *pPgn
26520 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
26530 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
26540 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26550 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
26560 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
26570 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
26580 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26590 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
265a0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
265b0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
265c0 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
265d0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
265e0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
265f0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
26600 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
26610 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
26620 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
26630 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
26640 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
26650 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
26660 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
26670 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
26680 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
26690 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
266a0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
266b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
266c0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
266d0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
266e0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
266f0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
26700 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
26710 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
26720 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
26730 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
26740 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
26750 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
26760 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20  , *pPgno, &pPg, 
26770 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
26780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26790 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
267a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
267b0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
267c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
267d0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
267e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
267f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28  turn rc;.      (
26800 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
26810 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
26820 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26830 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
26840 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
26850 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
26860 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
26870 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
26880 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
26890 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
268a0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
268b0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
268c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
268d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
268e0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
268f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
26900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26910 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
26920 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
26930 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
26940 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
26950 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
26960 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
26970 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
26980 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
26990 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
269a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
269b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
269c0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
269d0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
269e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
269f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
26a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
26a10 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
26a20 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
26a30 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
26a40 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
26a50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26a60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26a70 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
26a80 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
26a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
26aa0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
26ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26ac0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26ad0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
26ae0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
26af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26b00 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
26b10 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
26b20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
26b30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
26b40 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
26b50 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
26b60 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
26b70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26b80 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
26b90 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
26ba0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
26bb0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
26bc0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
26bd0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
26be0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
26bf0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
26c00 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
26c10 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
26c20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
26c30 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
26c40 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
26c50 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
26c60 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
26c70 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
26c80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
26c90 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
26ca0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
26cb0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
26cc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
26cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
26ce0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
26cf0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
26d00 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
26d10 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
26d20 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d40 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
26d50 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
26d60 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
26d90 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
26da0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
26db0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
26dc0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
26dd0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
26de0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
26df0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
26e20 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
26e30 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
26e40 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
26e70 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
26ea0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
26eb0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
26ec0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
26ed0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26ee0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
26ef0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
26f00 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
26f10 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
26f20 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
26f30 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
26f40 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
26f50 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
26f60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
26f70 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
26f80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26f90 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
26fa0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
26fb0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
26fc0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
26fd0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
26fe0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
26ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27000 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
27010 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
27020 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
27030 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
27040 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27050 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
27060 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27070 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
27080 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
27090 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
270a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
270b0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
270c0 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
270d0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
270e0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
270f0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
27100 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
27110 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
27120 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21  s..  */.  if( (!
27130 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 62  pPage && (rc = b
27140 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27150 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
27160 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20  0))).   ||      
27170 20 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69        (rc = sqli
27180 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27190 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20  age->pDbPage)). 
271a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
271b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
271c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
271d0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
271e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
271f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
27200 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
27210 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
27220 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
27230 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
27240 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
27250 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
27260 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
27270 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
27280 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
27290 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
272a0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
272b0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
272c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
272d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
272e0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
272f0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
27300 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
27310 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
27320 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
27330 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
27340 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
27350 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
27360 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
27370 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
27380 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
27390 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
273a0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
273b0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
273c0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
273d0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
273e0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
273f0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
27400 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
27410 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
27420 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
27430 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
27440 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
27450 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
27460 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
27470 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
27480 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
27490 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
274a0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
274b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
274c0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
274d0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
274e0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
274f0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
27500 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27510 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
27520 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27530 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
27540 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
27550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27560 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
27570 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
27580 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
27590 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
275a0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
275b0 6e 4c 65 61 66 20 3e 20 70 42 74 2d 3e 75 73 61  nLeaf > pBt->usa
275c0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
275d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
275e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
275f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
27600 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
27610 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
27620 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
27630 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
27640 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
27650 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
27660 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
27670 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
27680 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
27690 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
276a0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
276b0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
276c0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
276d0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
276e0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
276f0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
27700 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
27710 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
27720 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
27730 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
27740 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
27750 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
27760 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
27770 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
27780 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
27790 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
277a0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
277b0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
277c0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
277d0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
277e0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
277f0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
27800 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
27810 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
27820 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
27830 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
27840 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
27850 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
27860 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
27870 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
27880 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
27890 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
278a0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
278b0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
278c0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
278d0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
278e0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
278f0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
27900 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
27910 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
27920 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
27930 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
27940 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
27950 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
27960 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
27970 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
27980 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
27990 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
279a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
279b0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
279c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
279d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
279e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
279f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
27a00 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
27a10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
27a20 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
27a30 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23  af*4], iPage);.#
27a40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
27a50 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
27a60 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
27a70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27a80 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
27a90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
27aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
27ab0 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  if.        rc = 
27ac0 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
27ad0 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
27ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
27af0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
27b00 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
27b10 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
27b20 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
27b30 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
27b40 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27b60 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
27b70 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
27b80 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
27b90 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
27ba0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
27bb0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
27bc0 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
27bd0 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
27be0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
27bf0 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
27c00 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
27c10 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
27c20 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
27c30 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
27c40 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
27c50 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
27c60 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
27c70 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
27c80 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
27c90 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
27ca0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
27cb0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
27cc0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
27cd0 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
27ce0 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
27cf0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
27d00 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
27d10 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
27d20 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
27d30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27d40 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
27d50 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
27d60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27d70 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
27d80 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
27d90 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
27da0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
27db0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
27dc0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
27dd0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
27de0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
27df0 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
27e00 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
27e10 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
27e20 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
27e30 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
27e40 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
27e50 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
27e60 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
27e70 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
27e80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
27e90 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
27ea0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
27eb0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
27ec0 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
27ed0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
27ee0 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28  eturn freePage2(
27ef0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
27f00 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
27f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27f20 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
27f30 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
27f40 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
27f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27f60 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
27f70 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
27f80 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
27f90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27fa0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
27fb0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27fc0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
27fd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
27fe0 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
27ff0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
28000 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28010 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
28020 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
28030 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
28040 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
28050 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
28060 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
28070 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28080 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
28090 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
280a0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
280b0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
280c0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
280d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
280e0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
280f0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
28100 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28110 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
28120 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
28130 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
28140 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
28150 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
28160 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
28170 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
28180 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
28190 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
281a0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
281b0 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
281c0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
281d0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
281e0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
281f0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
28200 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
28210 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
28220 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
28230 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
28240 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
28250 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
28260 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
28270 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
28280 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
28290 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
282a0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
282b0 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
282c0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
282d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
282e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
282f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
28300 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
28310 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
28320 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
28330 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
28340 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
28350 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28360 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
28370 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
28380 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
28390 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66  o);.    if( pOvf
283a0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
283b0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
283c0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
283d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
283e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283f0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
28400 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
28410 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28420 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
28430 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
28440 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
28450 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
28460 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
28470 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
28480 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
28490 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
284a0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
284b0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
284c0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
284d0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
284e0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
284f0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
28500 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
28510 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
28520 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
28530 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
28540 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
28550 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
28560 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
28570 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
28580 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
28590 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
285a0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
285b0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
285c0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
285d0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
285e0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
285f0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
28600 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
28610 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
28620 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
28630 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
28640 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
28650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28660 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
28670 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
28680 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28690 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
286a0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
286b0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
286c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
286d0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
286e0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
286f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
28700 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
28710 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
28720 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28740 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
28750 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
28760 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
28770 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
28780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
28790 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
287a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
287b0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
287c0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
287d0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
287e0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
287f0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
28800 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
28810 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
28820 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28830 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
28840 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
28850 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
28860 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
28870 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
28880 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
28890 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
288a0 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
288b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
288c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
288d0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
288e0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
288f0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
28900 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
28910 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
28920 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
28930 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
28940 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
28950 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
28960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
28970 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
28980 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
28990 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
289a0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
289b0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
289c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
289d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
289e0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
289f0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
28a00 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
28a10 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
28a20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
28a30 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
28a40 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
28a50 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
28a60 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
28a70 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
28a80 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
28a90 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
28aa0 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
28ab0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
28ac0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
28ad0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
28ae0 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
28af0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
28b00 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
28b10 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
28b20 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
28b30 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
28b40 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
28b50 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
28b60 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
28b70 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
28b80 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
28b90 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
28ba0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
28bb0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
28bc0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
28bd0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
28be0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
28bf0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
28c00 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
28c10 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
28c20 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
28c30 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
28c40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28c50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
28c60 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
28c70 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
28c80 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
28c90 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
28ca0 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
28cb0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
28cc0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
28cd0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
28ce0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
28cf0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
28d00 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
28d10 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
28d20 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
28d30 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
28d40 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
28d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
28d60 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
28d70 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
28d80 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
28d90 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
28da0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
28db0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
28dc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
28dd0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
28de0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
28df0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
28e00 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
28e10 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
28e20 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
28e30 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
28e40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
28e50 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28e60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
28e70 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
28e80 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
28e90 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
28ea0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
28eb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28ec0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
28ed0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
28ee0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
28ef0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
28f00 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
28f10 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
28f20 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
28f30 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
28f40 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
28f50 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
28f60 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
28f70 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
28f80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
28f90 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
28fa0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
28fb0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
28fc0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
28fd0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
28fe0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
28ff0 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
29000 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
29010 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
29020 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
29030 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
29040 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
29050 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
29060 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
29070 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
29080 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
29090 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
290a0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
290b0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
290c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
290d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
290e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
290f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
29110 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
29120 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
29130 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
29140 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
29150 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
29160 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
29170 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
29180 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
291a0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
291b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
291c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
291d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
291e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
291f0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
29200 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29210 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
29220 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
29230 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
29240 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
29250 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
29260 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
29270 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
29280 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
29290 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
292a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
292b0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
292c0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
292d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
292e0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
292f0 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
29300 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
29310 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
29320 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
29330 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
29340 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
29350 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
29360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
29370 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
29380 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
29390 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
293a0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
293b0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
293c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
293d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
293e0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
293f0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
29400 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
29410 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
29420 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
29430 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
29440 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
29450 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
29460 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
29470 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
29480 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
29490 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
294a0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
294b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
294c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
294d0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
294e0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
294f0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
29500 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
29510 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
29520 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
29530 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
29540 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
29550 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
29560 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
29570 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
29580 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
29590 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
295a0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
295b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
295c0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
295d0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
295e0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
295f0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
29600 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
29610 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
29620 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
29630 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
29640 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
29650 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
29660 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
29670 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
29680 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
29690 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
296a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
296b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
296c0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
296d0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
296e0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
296f0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
29700 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
29710 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
29720 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
29730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29740 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
29750 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
29760 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
29770 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
29780 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
29790 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
297a0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
297b0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
297c0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
297d0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
297e0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
297f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
29800 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
29810 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
29820 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29830 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
29840 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
29850 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
29860 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
29870 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
29880 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
29890 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
298a0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
298b0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
298c0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
298d0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
298e0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
298f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
29900 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
29910 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
29920 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
29930 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
29940 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
29950 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
29960 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
29970 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
29980 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
29990 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
299a0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74  int *pRC){.  int
299b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
299c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
299d0 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
299e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
299f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
29a00 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
29a10 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
29a20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
29a30 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
29a40 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
29a50 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
29a60 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
29a70 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
29a80 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
29a90 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
29aa0 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
29ab0 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
29ac0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
29ad0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
29ae0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
29af0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
29b00 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
29b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29b20 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29b30 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
29b40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29b50 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
29b60 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29b70 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29b80 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
29b90 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
29ba0 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
29bb0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
29bc0 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c  ptr);.  if( (pc<
29bd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
29be0 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
29bf0 74 72 53 69 7a 65 29 0a 20 20 20 20 20 7c 7c 20  trSize).     || 
29c00 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42  (pc+sz>pPage->pB
29c10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29  t->usableSize) )
29c20 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
29c30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
29c50 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
29c60 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
29c70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
29c80 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
29c90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
29ca0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
29cb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
29cc0 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
29cd0 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
29ce0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
29cf0 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
29d00 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
29d10 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
29d20 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
29d30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
29d40 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
29d50 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
29d60 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
29d70 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
29d80 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
29d90 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
29da0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
29db0 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
29dc0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
29dd0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
29de0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
29df0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
29e00 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
29e10 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
29e20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
29e30 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
29e40 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
29e50 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
29e60 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
29e70 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
29e80 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
29e90 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
29ea0 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
29eb0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
29ec0 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
29ed0 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
29ee0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
29ef0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
29f00 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
29f10 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
29f20 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
29f30 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
29f40 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
29f50 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
29f60 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
29f70 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
29f80 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
29f90 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
29fa0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
29fb0 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
29fc0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
29fd0 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
29fe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29ff0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
2a000 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2a010 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
2a020 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
2a030 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
2a040 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
2a050 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
2a060 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
2a070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
2a080 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
2a090 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2a0a0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
2a0b0 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
2a0c0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
2a0d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
2a0e0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
2a0f0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
2a100 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
2a110 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
2a120 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
2a130 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
2a140 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
2a150 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
2a160 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
2a170 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
2a180 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
2a190 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
2a1a0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
2a1b0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2a1c0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
2a1d0 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
2a1e0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
2a1f0 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
2a200 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
2a210 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
2a220 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
2a230 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
2a240 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
2a250 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
2a260 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
2a270 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
2a280 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
2a290 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2a2a0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65  unter */.  int e
2a2b0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
2a2c0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
2a2d0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
2a2e0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2a2f0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
2a300 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2a310 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
2a320 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
2a330 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
2a340 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
2a350 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
2a360 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
2a370 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2a380 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2a390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
2a3a0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
2a3b0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2a3c0 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
2a3d0 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
2a3e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
2a3f0 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
2a400 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20  ..  int nSkip = 
2a410 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29  (iChild ? 4 : 0)
2a420 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  ;..  if( *pRC ) 
2a430 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2a440 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
2a450 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
2a460 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
2a470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a480 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2a490 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2a4a0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2a4b0 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
2a4c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2a4d0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
2a4e0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
2a4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2a500 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2a510 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
2a520 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a530 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a540 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a550 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2a560 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
2a570 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
2a580 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
2a590 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
2a5a0 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
2a5b0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2a5c0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
2a5d0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
2a5e0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2a5f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
2a600 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
2a610 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
2a620 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
2a630 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69      assert( j<(i
2a640 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65  nt)(sizeof(pPage
2a650 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
2a660 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2a670 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2a680 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
2a690 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
2a6a0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
2a6b0 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
2a6c0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
2a6d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a6e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a6f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2a700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a710 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2a720 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2a730 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2a740 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2a750 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2a760 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
2a770 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2a780 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
2a790 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
2a7a0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
2a7b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2a7c0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2a7d0 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
2a7e0 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
2a7f0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
2a800 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
2a810 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
2a820 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
2a830 3b 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ; }.    assert( 
2a840 69 64 78 3e 3d 65 6e 64 2b 32 20 29 3b 0a 20 20  idx>=end+2 );.  
2a850 20 20 69 66 28 20 69 64 78 2b 73 7a 20 3e 20 70    if( idx+sz > p
2a860 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2a870 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2a  eSize ){.      *
2a880 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2a890 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2a8a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2a8b0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
2a8c0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
2a8d0 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
2a8e0 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
2a8f0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
2a900 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
2a910 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
2a920 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2a930 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
2a940 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
2a950 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
2a960 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b  =end, ptr=&data[
2a970 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
2a980 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
2a990 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
2a9a0 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
2a9b0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
2a9c0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2a9d0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
2a9e0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2a9f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2aa00 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
2aa10 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
2aa20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2aa30 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
2aa40 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
2aa50 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
2aa60 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
2aa70 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
2aa80 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2aa90 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
2aaa0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
2aab0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
2aac0 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
2aad0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
2aae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
2aaf0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
2ab00 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
2ab10 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
2ab20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2ab30 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
2ab40 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
2ab50 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
2ab60 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
2ab70 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
2ab80 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
2ab90 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2aba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2abb0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
2abc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2abd0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2abe0 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
2abf0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
2ac00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
2ac10 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
2ac20 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
2ac30 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2ac40 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
2ac50 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
2ac60 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
2ac70 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
2ac80 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
2ac90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
2aca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2acb0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2acc0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20  u8 *pCellptr;   
2acd0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2ace0 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
2acf0 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
2ad00 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
2ad10 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
2ad20 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20   body */.  u8 * 
2ad30 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
2ad40 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
2ad50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2ad60 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
2ad70 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2ad80 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
2ad90 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
2ada0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2adb0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67  f header on pPag
2adc0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2add0 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65   nUsable = pPage
2ade0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2adf0 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
2ae00 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20  e of page */..  
2ae10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ae20 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
2ae30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ae40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ae50 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ae60 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
2ae70 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d  l>=0 && nCell<=M
2ae80 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2ae90 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2aea0 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
2aeb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2aec0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2aed0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2aee0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
2aef0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2af00 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
2af10 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
2af20 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
2af30 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2af40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
2af50 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2af60 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29  r+5])==nUsable )
2af70 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20  ;..  pCellptr = 
2af80 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
2af90 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
2afa0 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d  2];.  cellbody =
2afb0 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28   nUsable;.  for(
2afc0 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b  i=nCell-1; i>=0;
2afd0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i--){.    pCell
2afe0 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65  ptr -= 2;.    ce
2aff0 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b  llbody -= aSize[
2b000 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  i];.    put2byte
2b010 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
2b020 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
2b030 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
2b040 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
2b050 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75  ze[i]);.  }.  pu
2b060 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b070 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2b080 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2b090 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2b0a0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2b0b0 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2b0c0 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2b0d0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2b0e0 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2b0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2b100 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2b110 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2b120 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2b130 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2b140 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2b150 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2b160 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2b170 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2b180 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2b190 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2b1a0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2b1b0 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2b1c0 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2b1d0 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2b1e0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2b1f0 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2b200 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2b210 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2b220 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2b230 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2b240 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2b250 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2b260 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2b270 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2b280 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2b290 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2b2a0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2b2b0 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2b2c0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2b2d0 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2b2e0 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2b2f0 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2b300 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2b310 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2b320 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2b330 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2b340 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
2b350 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
2b360 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
2b370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
2b380 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2b390 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
2b3a0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
2b3b0 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
2b3c0 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
2b3d0 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
2b3e0 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
2b3f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2b400 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
2b410 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
2b420 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
2b430 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
2b440 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
2b450 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
2b460 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
2b470 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
2b480 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
2b490 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
2b4a0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
2b4b0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
2b4c0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
2b4d0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
2b4e0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
2b4f0 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
2b500 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
2b510 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2b520 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
2b530 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
2b540 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
2b550 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
2b560 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
2b570 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
2b580 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
2b590 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
2b5a0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
2b5b0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
2b5c0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
2b5d0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
2b5e0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
2b5f0 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
2b600 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
2b610 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
2b620 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
2b630 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
2b640 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
2b650 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
2b660 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
2b670 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
2b680 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
2b690 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
2b6a0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
2b6b0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
2b6c0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
2b6d0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
2b6e0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
2b6f0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2b700 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
2b710 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
2b720 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
2b730 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
2b740 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
2b750 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
2b760 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
2b770 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
2b780 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
2b790 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
2b7a0 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
2b7b0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
2b7c0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2b7d0 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
2b7e0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
2b7f0 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
2b800 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
2b810 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
2b820 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
2b830 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
2b840 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2b850 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
2b860 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
2b870 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
2b880 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
2b890 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
2b8a0 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
2b8b0 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
2b8c0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2b8d0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b8f0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
2b900 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b930 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2b940 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2b970 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
2b980 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2b990 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b9a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2b9b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2b9c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b9d0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2b9e0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2b9f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2ba00 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
2ba10 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
2ba20 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  <=0 ) return SQL
2ba30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ba40 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2ba50 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69   a new page. Thi
2ba60 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
2ba70 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62  me the right-sib
2ba80 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50  ling of .  ** pP
2ba90 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  age. Make the pa
2baa0 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62  rent page writab
2bab0 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  le, so that the 
2bac0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2bad0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73  .  ** may be ins
2bae0 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74  erted. If both t
2baf0 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  hese operations 
2bb00 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20  are successful, 
2bb10 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
2bb20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2bb30 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
2bb40 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
2bb50 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  0);..  if( rc==S
2bb60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
2bb70 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70   u8 *pOut = &pSp
2bb80 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a  ace[4];.    u8 *
2bb90 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
2bba0 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
2bbb0 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20     u16 szCell = 
2bbc0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2bbd0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75  e, pCell);.    u
2bbe0 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61  8 *pStop;..    a
2bbf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2bc00 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2bc10 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
2bc20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2bc30 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50  ge->aData[0]==(P
2bc40 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2bc50 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2bc60 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2bc70 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45  (pNew, PTF_INTKE
2bc80 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2bc90 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73  TF_LEAF);.    as
2bca0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2bcb0 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
2bcc0 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ell);..    /* If
2bcd0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2bce0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2bcf0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2bd00 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
2bd10 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
2bd20 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
2bd30 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
2bd40 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
2bd50 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
2bd60 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2bd70 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20  page. If either 
2bd80 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20  of these.    ** 
2bd90 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73  operations fails
2bda0 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  , the return cod
2bdb0 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68  e is set, but th
2bdc0 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a  e contents.    *
2bdd0 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
2bde0 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d  page are still m
2bdf0 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68  anipulated by th
2be00 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20  h code below..  
2be10 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c    ** That is Ok,
2be20 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   at this point t
2be30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
2be40 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  s guaranteed to.
2be50 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64      ** be marked
2be60 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72   as dirty. Retur
2be70 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
2be80 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a  de will cause a.
2be90 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c      ** rollback,
2bea0 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61   undoing any cha
2beb0 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
2bec0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
2bed0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2bee0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2bef0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2bf00 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
2bf10 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
2bf20 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
2bf30 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70      if( szCell>p
2bf40 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b  New->minLocal ){
2bf50 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
2bf60 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
2bf70 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20  pCell, &rc);.   
2bf80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
2bf90 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69    /* Create a di
2bfa0 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e  vider cell to in
2bfb0 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e  sert into pParen
2bfc0 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63  t. The divider c
2bfd0 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  ell.    ** consi
2bfe0 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20  sts of a 4-byte 
2bff0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65  page number (the
2c000 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2c010 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a  pPage) and.    *
2c020 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  * a variable len
2c030 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77  gth key value (w
2c040 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65  hich must be the
2c050 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74   same value as t
2c060 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73  he.    ** larges
2c070 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e  t key on pPage).
2c080 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2c090 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65  o find the large
2c0a0 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20  st key value on 
2c0b0 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e  pPage, first fin
2c0c0 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  d the right-most
2c0d0 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2c0e0 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73   pPage. The firs
2c0f0 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20  t two fields of 
2c100 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68  this cell are th
2c110 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  e .    ** record
2c120 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61  -length (a varia
2c130 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2c140 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69  er at most 32-bi
2c150 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20  ts in size).    
2c160 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76  ** and the key v
2c170 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65  alue (a variable
2c180 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c   length integer,
2c190 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61   may have any va
2c1a0 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65  lue)..    ** The
2c1b0 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68   first of the wh
2c1c0 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62  ile(...) loops b
2c1d0 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20  elow skips over 
2c1e0 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74  the record-lengt
2c1f0 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20  h.    ** field. 
2c200 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65  The second while
2c210 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65  (...) loop copie
2c220 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
2c230 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2c240 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e  cell on pPage in
2c250 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
2c260 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ffer..    */.   
2c270 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c280 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
2c290 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53  nCell-1);.    pS
2c2a0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2c2b0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70  .    while( (*(p
2c2c0 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26  Cell++)&0x80) &&
2c2d0 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
2c2e0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2c2f0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2c300 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20  ( ((*(pOut++) = 
2c310 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30  *(pCell++))&0x80
2c320 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2c330 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65   );..    /* Inse
2c340 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  rt the new divid
2c350 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61  er cell into pPa
2c360 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73  rent. */.    ins
2c370 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2c380 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c   pParent->nCell,
2c390 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70   pSpace, (int)(p
2c3a0 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20  Out-pSpace),.   
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
2c3c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Page->pgno, &rc)
2c3d0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
2c3e0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  e right-child po
2c3f0 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74  inter of pParent
2c400 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2c410 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2c420 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2c430 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2c440 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2c450 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20  , pgnoNew);.  . 
2c460 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2c470 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2c480 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
2c490 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c4a0 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNew);.  }..  re
2c4b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
2c4c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c4d0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
2c4e0 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68  ..#if 0./*.** Th
2c4f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2c500 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2c510 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
2c520 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c  operation of SQL
2c530 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f  ite..** it is so
2c540 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65  metimes activate
2c550 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68  d temporarily wh
2c560 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f  ile debugging co
2c570 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a  de responsible .
2c580 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70  ** for setting p
2c590 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2c5a0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2c5b0 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  t ptrmapCheckPag
2c5c0 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50  es(MemPage **apP
2c5d0 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  age, int nPage){
2c5e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
2c5f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b  or(i=0; i<nPage;
2c600 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20   i++){.    Pgno 
2c610 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20  n;.    u8 e;.   
2c620 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2c630 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20  = apPage[i];.   
2c640 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2c650 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20   pPage->pBt;.   
2c660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c670 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66  isInit );..    f
2c680 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d  or(j=0; j<pPage-
2c690 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  >nCell; j++){.  
2c6a0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2c6b0 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a  o;.      u8 *z;.
2c6c0 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20       .      z = 
2c6d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c6e0 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  j);.      btreeP
2c6f0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2c700 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  e, z, &info);.  
2c710 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
2c720 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
2c730 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
2c740 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69  t4byte(&z[info.i
2c750 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
2c760 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2c770 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29  t, ovfl, &e, &n)
2c780 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c790 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2c7a0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56   && e==PTRMAP_OV
2c7b0 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20  ERFLOW1 );.     
2c7c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
2c7d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2c7e0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2c7f0 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20  = get4byte(z);. 
2c800 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2c810 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2c820 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2c830 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2c840 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2c850 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  P_BTREE );.     
2c860 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c870 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2c880 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
2c890 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2c8a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2c8b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2c8c0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74  .      ptrmapGet
2c8d0 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2c8e0 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65   &n);.      asse
2c8f0 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2c900 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2c910 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20  BTREE );.    }. 
2c920 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2c930 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2c940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c950 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65  used to copy the
2c960 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2c970 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f   b-tree node sto
2c980 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20  red .** on page 
2c990 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2c9a0 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d  o. If page pFrom
2c9b0 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20   was not a leaf 
2c9c0 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  page, then.** th
2c9d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2c9e0 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63  tries for each c
2c9f0 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70  hild page are up
2ca00 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2ca10 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65  e.** parent page
2ca20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2ca30 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61  ointer map is pa
2ca40 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d  ge pTo. If pFrom
2ca50 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e   contained.** an
2ca60 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65  y cells with ove
2ca70 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2ca80 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
2ca90 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e  rresponding poin
2caa0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
2cab0 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61  es are also upda
2cac0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
2cad0 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70  parent page is p
2cae0 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49  age pTo..**.** I
2caf0 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65  f pFrom is curre
2cb00 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e  ntly carrying an
2cb10 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  y overflow cells
2cb20 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65   (entries in the
2cb30 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66  .** MemPage.aOvf
2cb40 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
2cb50 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
2cb60 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
2cb70 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
2cb80 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
2cb90 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
2cba0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
2cbb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
2cbc0 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
2cbd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
2cbe0 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
2cbf0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
2cc00 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
2cc10 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
2cc20 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
2cc30 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
2cc40 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
2cc50 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
2cc60 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
2cc70 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
2cc80 61 74 69 63 20 69 6e 74 20 63 6f 70 79 4e 6f 64  atic int copyNod
2cc90 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
2cca0 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
2ccb0 20 2a 70 54 6f 29 7b 0a 20 20 42 74 53 68 61 72   *pTo){.  BtShar
2ccc0 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
2ccd0 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 75   pFrom->pBt;.  u
2cce0 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
2ccf0 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
2cd00 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
2cd10 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
2cd20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
2cd30 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
2cd40 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 63 6f  Offset;.  int co
2cd50 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
2cd60 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
2cd70 30 30 20 3a 20 30 29 3b 0a 20 20 69 6e 74 20 72  00 : 0);.  int r
2cd80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2cd90 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 61   int iData;..  a
2cda0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
2cdb0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2cdc0 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
2cdd0 69 54 6f 48 64 72 20 29 3b 0a 20 20 61 73 73 65  iToHdr );.  asse
2cde0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
2cdf0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2ce00 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  <=pBt->usableSiz
2ce10 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  e );..  /* Copy 
2ce20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2ce30 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
2ce40 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2ce50 70 54 6f 2e 20 2a 2f 0a 20 20 69 44 61 74 61 20  pTo. */.  iData 
2ce60 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
2ce70 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
2ce80 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
2ce90 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
2cea0 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
2ceb0 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 6d  Size-iData);.  m
2cec0 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
2ced0 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
2cee0 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
2cef0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
2cf00 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a  m->nCell);..  /*
2cf10 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2cf20 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2cf30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf40 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2cf50 74 75 72 65 0a 20 20 2a 2a 20 6d 61 74 63 68 20  ture.  ** match 
2cf60 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
2cf70 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2cf80 20 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22   of pTo "cannot"
2cf90 20 66 61 69 6c 2c 20 61 73 20 74 68 65 0a 20 20   fail, as the.  
2cfa0 2a 2a 20 64 61 74 61 20 63 6f 70 69 65 64 20 66  ** data copied f
2cfb0 72 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b 6e 6f  rom pFrom is kno
2cfc0 77 6e 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 20  wn to be valid. 
2cfd0 20 2a 2f 0a 20 20 70 54 6f 2d 3e 69 73 49 6e 69   */.  pTo->isIni
2cfe0 74 20 3d 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c  t = 0;.  TESTONL
2cff0 59 28 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e  Y(rc = ) btreeIn
2d000 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61  itPage(pTo);.  a
2d010 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2d020 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  E_OK );..  /* If
2d030 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2d040 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2d050 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2d060 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2d070 0a 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d  .  ** for any b-
2d080 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2d090 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2d0a0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2d0b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f   pointers to. */
2d0c0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2d0d0 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
2d0e0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2d0f0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
2d100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d110 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2d120 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2d130 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2d140 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2d150 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2d160 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2d170 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2d180 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2d190 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2d1a0 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2d1b0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2d1c0 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2d1d0 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2d1e0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2d1f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2d200 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2d210 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2d220 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2d230 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2d240 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2d250 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2d260 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2d270 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2d280 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2d290 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2d2a0 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2d2b0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2d2c0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2d2d0 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2d2e0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2d2f0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2d300 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2d310 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2d320 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2d330 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2d340 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2d350 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2d360 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2d370 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2d380 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2d390 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2d3a0 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2d3b0 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2d3c0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2d3d0 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2d3e0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2d3f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d400 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2d410 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2d420 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2d430 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2d440 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2d450 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2d460 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2d470 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2d480 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2d490 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2d4a0 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2d4b0 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2d4c0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2d4d0 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2d4e0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2d4f0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2d500 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2d510 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2d520 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2d530 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2d540 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2d550 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2d560 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2d570 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2d580 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2d590 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2d5a0 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2d5b0 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2d5c0 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2d5d0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2d5e0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2d5f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2d600 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2d610 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2d620 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2d630 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2d640 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2d650 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2d660 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2d670 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2d680 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2d690 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2d6a0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2d6b0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2d6c0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2d6d0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2d6e0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2d6f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2d700 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2d710 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2d720 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2d730 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2d740 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2d750 72 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  r page-size byte
2d760 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69  s in size. If, i
2d770 6e 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  n inserting cell
2d780 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2d790 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
2d7a0 6e 74 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20  nt), the parent 
2d7b0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
2d7c0 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
2d7d0 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
2d7e0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
2d7f0 74 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ts overflow cell
2d800 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
2d810 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
2d820 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
2d830 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
2d840 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
2d850 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
2d860 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
2d870 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
2d880 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
2d890 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
2d8a0 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
2d8b0 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
2d8c0 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
2d8d0 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
2d8e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2d8f0 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
2d900 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
2d910 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
2d920 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
2d930 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
2d940 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2d950 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2d960 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2d970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d980 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2d990 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2d9a0 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
2d9b0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2d9c0 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
2d9d0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2d9e0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
2d9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2da00 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
2da10 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
2da20 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
2da30 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
2da40 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
2da50 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
2da60 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
2da70 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
2da80 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
2da90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2daa0 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
2dab0 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
2dac0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2dad0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2dae0 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
2daf0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
2db00 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
2db10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2db20 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
2db30 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
2db40 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
2db50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2db60 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
2db70 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
2db80 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
2db90 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
2dba0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dbb0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2dbc0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
2dbd0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2dbe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dbf0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2dc00 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
2dc10 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
2dc20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2dc30 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2dc40 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
2dc50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2dc60 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
2dc70 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
2dc80 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
2dc90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2dca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2dcb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
2dcc0 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
2dcd0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
2dce0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2dcf0 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
2dd00 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
2dd30 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
2dd40 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
2dd50 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
2dd60 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2dd70 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
2dd80 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
2dd90 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
2dda0 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
2ddb0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2ddc0 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
2ddd0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
2dde0 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
2ddf0 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
2de00 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
2de10 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
2de20 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
2de30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2de40 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
2de50 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
2de60 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
2de70 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
2de80 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2de90 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
2dea0 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
2deb0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
2dec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2ded0 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
2dee0 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
2def0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
2df00 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
2df10 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2df20 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
2df30 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2df40 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
2df50 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
2df60 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
2df70 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
2df80 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
2df90 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
2dfa0 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
2dfb0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
2dfc0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
2dfd0 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
2dfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2dff0 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
2e000 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
2e010 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
2e020 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
2e030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
2e040 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
2e050 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2e060 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
2e070 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2e080 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
2e090 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
2e0a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
2e0b0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2e0c0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
2e0d0 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
2e0e0 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
2e0f0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2e100 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2e110 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2e120 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
2e130 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2e140 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e150 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2e160 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
2e170 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
2e180 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
2e190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2e1a0 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
2e1b0 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
2e1c0 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2e1d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e1e0 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
2e1f0 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
2e200 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
2e210 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
2e220 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2e230 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2e240 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2e250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e260 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e270 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2e280 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
2e290 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2e2a0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2e2b0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2e2c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2e2d0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
2e2e0 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
2e2f0 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
2e300 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
2e310 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
2e320 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
2e330 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
2e340 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
2e350 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
2e360 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
2e370 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
2e380 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
2e390 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
2e3a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
2e3b0 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
2e3c0 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
2e3d0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2e3e0 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
2e3f0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2e400 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
2e410 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
2e420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2e430 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2e440 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
2e450 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61  Ovfl[0].idx==iPa
2e460 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
2e470 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
2e480 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e490 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2e4a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
2e4b0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
2e4c0 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
2e4d0 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
2e4e0 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
2e4f0 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
2e500 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
2e510 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
2e520 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
2e530 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
2e540 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
2e550 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
2e560 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
2e570 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
2e580 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
2e590 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
2e5a0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
2e5b0 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
2e5c0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
2e5d0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
2e5e0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
2e5f0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
2e600 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
2e610 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2e620 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
2e630 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2e640 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2e650 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
2e660 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
2e670 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
2e680 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
2e690 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
2e6a0 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
2e6b0 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
2e6c0 6e 74 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f  nt page, as if o
2e6d0 6e 65 20 65 78 69 73 74 65 64 20 69 74 20 68 61  ne existed it ha
2e6e0 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  s already.  ** b
2e6f0 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f  een removed.  */
2e700 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
2e710 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
2e720 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
2e730 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
2e740 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64  iv = 0;.    nOld
2e750 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b   = i+1;.  }else{
2e760 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20  .    nOld = 3;. 
2e770 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
2e780 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
2e790 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
2e7a0 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
2e7b0 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
2e7c0 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
2e7d0 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20  xDiv = i-2;.    
2e7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44  }else{.      nxD
2e7f0 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
2e800 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
2e810 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69   2;.  }.  if( (i
2e820 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2e830 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
2e840 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2e850 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
2e860 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2e870 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2e880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2e890 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
2e8a0 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2e8b0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2e8c0 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
2e8d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
2e8e0 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
2e8f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
2e900 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2e910 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
2e920 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2e930 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
2e940 4f 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66  Old, 0, i*sizeof
2e950 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
2e960 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2e970 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
2e980 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
2e990 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
2e9a0 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
2e9b0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
2e9c0 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
2e9d0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e  ..    if( pParen
2e9e0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20  t->nOverflow && 
2e9f0 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
2ea00 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29  ->aOvfl[0].idx )
2ea10 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2ea20 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66   = pParent->aOvf
2ea30 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
2ea40 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2ea50 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2ea60 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
2ea70 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2ea80 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
2ea90 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
2eaa0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
2eab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
2eac0 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
2ead0 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2eae0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2eaf0 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
2eb00 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2eb10 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2eb20 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2eb30 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2eb40 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
2eb50 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
2eb60 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2eb70 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
2eb80 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
2eb90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
2eba0 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
2ebb0 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
2ebc0 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
2ebd0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
2ebe0 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
2ebf0 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
2ec00 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
2ec10 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
2ec20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2ec30 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
2ec40 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2ec50 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
2ec60 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
2ec70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
2ec80 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
2ec90 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
2eca0 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
2ecb0 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
2ecc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2ecd0 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69   Unless SQLite i
2ece0 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65  s compiled in se
2ecf0 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
2ed00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2ed10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
2ed20 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
2ed30 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2ed40 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
2ed50 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
2ed60 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2ed70 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
2ed80 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
2ed90 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
2eda0 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
2edb0 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
2edc0 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
2edd0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
2ede0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
2edf0 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
2ee00 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66  ated.  */.#ifdef
2ee10 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
2ee20 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63  ELETE.      memc
2ee30 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61  py(&aOvflSpace[a
2ee40 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
2ee50 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69  >aData], apDiv[i
2ee60 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20  ], szNew[i]);.  
2ee70 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
2ee80 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
2ee90 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
2eea0 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ta];.#endif.    
2eeb0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
2eec0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2eed0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
2eee0 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
2eef0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ef00 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
2ef10 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
2ef20 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
2ef30 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
2ef40 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
2ef50 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
2ef60 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
2ef70 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
2ef80 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
2ef90 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
2efa0 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
2efb0 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
2efc0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
2efd0 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
2efe0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
2eff0 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
2f020 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
2f030 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
2f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f050 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
2f060 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
2f070 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f090 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
2f0a0 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
2f0e0 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
2f0f0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2f100 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
2f110 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
2f120 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
2f130 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2f140 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
2f150 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2f160 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
2f170 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
2f180 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
2f190 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
2f1a0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
2f1b0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2f1c0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2f1d0 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
2f1e0 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
2f1f0 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
2f200 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
2f210 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
2f220 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2f230 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
2f240 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
2f250 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
2f260 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
2f270 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
2f280 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
2f290 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
2f2a0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
2f2b0 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
2f2c0 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
2f2d0 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
2f2e0 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
2f2f0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
2f300 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
2f310 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
2f320 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
2f330 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
2f340 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
2f350 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
2f360 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
2f370 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
2f380 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2f390 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
2f3a0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
2f3b0 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
2f3c0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
2f3d0 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
2f3e0 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
2f3f0 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
2f400 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
2f410 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
2f420 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
2f430 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
2f440 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
2f450 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
2f460 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2f470 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
2f480 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
2f490 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
2f4a0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
2f4b0 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
2f4c0 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
2f4d0 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65   keys..  */.  le
2f4e0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61  afCorrection = a
2f4f0 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b  pOld[0]->leaf*4;
2f500 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70  .  leafData = ap
2f510 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b  Old[0]->hasData;
2f520 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2f530 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ld; i++){.    in
2f540 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20  t limit;.    .  
2f550 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
2f560 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
2f570 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   take a copy of 
2f580 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61  the i'th origina
2f590 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  l sibling.    **
2f5a0 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
2f5b0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
2f5c0 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
2f5d0 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
2f5e0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
2f5f0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
2f600 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
2f610 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
2f620 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  in the.    ** pr
2f630 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
2f640 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
2f650 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
2f660 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  d = apCopy[i] = 
2f670 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63  (MemPage*)&aSpac
2f680 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e1[pBt->pageSize
2f690 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d   + k*i];.    mem
2f6a0 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b  cpy(pOld, apOld[
2f6b0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
2f6c0 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e  ge));.    pOld->
2f6d0 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
2f6e0 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pOld[1];.    mem
2f6f0 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c  cpy(pOld->aData,
2f700 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61   apOld[i]->aData
2f710 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
2f720 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70  ;..    limit = p
2f730 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
2f740 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
2f750 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
2f760 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
2f770 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2f780 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
2f790 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
2f7a0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2f7b0 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
2f7c0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2f7d0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
2f7e0 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
2f7f0 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  ;.      nCell++;
2f800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2f810 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
2f820 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
2f830 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
2f840 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
2f850 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
2f860 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
2f870 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
2f880 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
2f890 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
2f8a0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
2f8b0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
2f8c0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
2f8d0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
2f8e0 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
2f8f0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
2f900 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
2f910 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
2f920 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
2f930 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
2f940 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
2f950 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
2f960 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
2f970 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2f980 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
2f990 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
2f9a0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2f9b0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
2f9c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2f9d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
2f9e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2f9f0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2fa00 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
2fa10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2fa20 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
2fa30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
2fa40 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
2fa50 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
2fa60 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
2fa70 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
2fa80 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
2fa90 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2faa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
2fab0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
2fac0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
2fad0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
2fae0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
2faf0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2fb00 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
2fb10 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
2fb20 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
2fb30 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
2fb40 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
2fb50 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
2fb60 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
2fb70 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
2fb80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fb90 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
2fba0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
2fbb0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
2fbc0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
2fbd0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
2fbe0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
2fbf0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
2fc00 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
2fc10 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
2fc20 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
2fc30 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
2fc40 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
2fc50 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
2fc60 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
2fc70 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2fc80 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
2fc90 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
2fca0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
2fcb0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
2fcc0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
2fcd0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
2fce0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
2fcf0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
2fd00 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
2fd10 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
2fd20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
2fd30 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2fd40 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
2fd50 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
2fd60 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
2fd70 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2fd80 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
2fd90 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
2fda0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
2fdb0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
2fdc0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
2fdd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
2fde0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2fdf0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2fe00 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
2fe10 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
2fe20 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
2fe30 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
2fe40 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
2fe50 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
2fe60 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2fe70 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
2fe80 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
2fe90 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
2fea0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2feb0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
2fec0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
2fed0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
2fee0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
2fef0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
2ff00 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
2ff10 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2ff20 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
2ff30 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
2ff40 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
2ff50 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
2ff60 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
2ff70 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
2ff80 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
2ff90 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
2ffa0 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74  ITE_CORRUPT; got
2ffb0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2ffc0 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
2ffd0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
2ffe0 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
2fff0 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
30000 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
30010 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
30020 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
30030 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
30040 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
30050 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
30060 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
30070 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
30080 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
30090 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
300a0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
300b0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
300c0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
300d0 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
300e0 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
300f0 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
30100 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
30110 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
30120 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
30130 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
30140 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
30150 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
30160 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
30170 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
30180 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
30190 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
301a0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
301b0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
301c0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
301d0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
301e0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
301f0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
30200 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
30210 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
30220 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
30230 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
30240 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
30250 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
30260 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
30270 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
30280 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
30290 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
302a0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
302b0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
302c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
302d0 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
302e0 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
302f0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30310 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
30320 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
30330 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
30340 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
30350 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
30360 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
30370 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
30380 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
30390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
303a0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
303b0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
303c0 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
303d0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
303e0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
303f0 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
30400 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
30410 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
30420 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
30430 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
30440 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
30450 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
30460 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
30470 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
30480 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
30490 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
304a0 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
304b0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
304c0 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
304d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
304e0 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
304f0 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
30500 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
30510 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
30520 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
30530 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
30540 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
30550 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
30560 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
30570 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
30580 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
30590 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
305a0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
305b0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
305c0 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  =0) );..  TRACE(
305d0 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
305e0 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20  %d %d %d  ",.   
305f0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c   apOld[0]->pgno,
30600 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
30610 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apOld[1]->pgno :
30620 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
30630 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f  ? apOld[2]->pgno
30640 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a   : 0.  ));..  /*
30650 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
30660 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
30670 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
30680 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
30690 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d  /.  if( apOld[0]
306a0 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20  ->pgno<=1 ){.   
306b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
306c0 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62  RUPT;.    goto b
306d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
306e0 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20    }.  pageFlags 
306f0 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74  = apOld[0]->aDat
30700 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
30710 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
30720 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
30730 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
30740 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
30750 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
30760 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
30770 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
30780 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30790 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
307a0 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
307b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
307c0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
307d0 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
307e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
307f0 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
30800 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
30810 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
30820 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b  &pgno, pgno, 0);
30830 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
30840 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30850 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
30860 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
30870 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
30880 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
30890 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
308a0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
308b0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
308c0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
308d0 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
308e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
308f0 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
30900 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
30910 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
30920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30940 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
30950 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
30960 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
30980 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
30990 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
309a0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
309b0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
309c0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
309d0 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
309e0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
309f0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
30a00 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
30a10 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
30a20 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
30a30 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
30a40 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
30a50 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
30a60 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
30a70 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
30a80 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
30a90 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
30aa0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
30ab0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
30ac0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
30ad0 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
30ae0 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
30af0 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
30b00 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
30b10 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
30b20 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
30b30 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
30b40 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
30b50 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
30b60 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
30b70 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
30b80 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
30b90 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
30ba0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
30bb0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
30bc0 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
30bd0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
30be0 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
30bf0 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
30c00 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
30c10 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
30c20 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
30c30 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
30c40 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
30c50 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
30c60 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
30c70 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
30c80 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
30c90 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
30ca0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
30cb0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
30cc0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
30cd0 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
30ce0 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
30cf0 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
30d00 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
30d10 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
30d20 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
30d30 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
30d40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
30d50 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
30d60 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70  pT;.      t = ap
30d70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
30d80 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
30d90 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
30da0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
30db0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
30dc0 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
30dd0 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
30de0 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
30df0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
30e00 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
30e10 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
30e20 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
30e30 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
30e40 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
30e50 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
30e60 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
30e70 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
30e80 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
30e90 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
30ea0 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
30eb0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
30ec0 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
30ed0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
30ee0 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
30ef0 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
30f00 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
30f10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
30f20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30f30 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
30f40 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
30f50 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
30f60 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
30f70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
30f80 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
30f90 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
30fa0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
30fb0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
30fc0 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
30fd0 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
30fe0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
30ff0 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
31000 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
31010 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
31020 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
31030 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
31040 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31050 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
31060 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
31070 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
31080 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
31090 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
310a0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
310b0 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
310c0 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
310d0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
310e0 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
310f0 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
31100 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
31110 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
31120 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
31130 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
31140 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
31150 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
31160 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
31170 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
31180 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
31190 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
311a0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
311b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
311c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
311d0 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
311e0 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
311f0 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
31200 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
31210 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
31220 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
31230 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31240 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
31250 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
31260 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
31270 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
31280 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
31290 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
312a0 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
312b0 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
312c0 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
312d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
312e0 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
312f0 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
31300 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
31310 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
31320 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
31330 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
31340 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
31350 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
31360 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
31370 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
31380 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
31390 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
313a0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
313b0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
313c0 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
313d0 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
313e0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
313f0 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
31400 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
31410 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
31420 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
31430 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
31440 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
31450 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
31460 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
31470 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
31480 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
31490 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
314a0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
314b0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
314c0 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
314d0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
314e0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
314f0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
31500 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
31510 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
31520 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
31530 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
31540 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
31550 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
31560 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
31570 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
31580 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
31590 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
315a0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
315b0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
315c0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
315d0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
315e0 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
315f0 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
31600 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
31610 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
31620 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
31630 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
31640 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
31650 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
31660 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
31670 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
31680 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
31690 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
316a0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
316b0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
316c0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
316d0 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
316e0 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
316f0 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
31700 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
31710 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
31720 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
31730 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
31740 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
31750 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
31760 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
31770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
31780 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
31790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
317a0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
317b0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
317c0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
317d0 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
317e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
317f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
31800 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
31810 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
31820 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
31830 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31840 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74   iOvflSpace<=pBt
31850 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
31860 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
31870 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
31880 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
31890 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
318a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
318b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
318c0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
318d0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
318e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
318f0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
31900 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
31910 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
31920 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
31930 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
31940 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
31950 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
31960 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
31970 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
31980 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
31990 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
319a0 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
319b0 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
319c0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
319d0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
319e0 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
319f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
31a00 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
31a10 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
31a20 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
31a30 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
31a40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
31a50 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
31a60 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
31a70 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
31a80 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
31a90 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
31aa0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
31ab0 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
31ac0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
31ad0 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
31ae0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
31af0 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
31b00 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
31b10 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
31b20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
31b30 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
31b40 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
31b50 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
31b60 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
31b70 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
31b80 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
31b90 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
31ba0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
31bb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
31bc0 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
31bd0 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
31be0 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
31bf0 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
31c00 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
31c10 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
31c20 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
31c30 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
31c40 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
31c50 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
31c60 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
31c70 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
31c80 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
31c90 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
31ca0 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
31cb0 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
31cc0 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
31cd0 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
31ce0 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
31cf0 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
31d00 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
31d10 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
31d20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
31d30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
31d40 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
31d50 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
31d60 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
31d70 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
31d80 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
31d90 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
31da0 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
31db0 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
31dc0 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
31dd0 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
31de0 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
31df0 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
31e00 20 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c    );.    if( SQL
31e10 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 63 6f  ITE_OK==(rc = co
31e20 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70  pyNodeContent(ap
31e30 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 29  New[0], pParent)
31e40 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
31e50 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30  freePage(apNew[0
31e60 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
31e70 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55  e if( ISAUTOVACU
31e80 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78  UM ){.    /* Fix
31e90 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31ea0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
31eb0 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20   the cells that 
31ec0 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f  were shifted aro
31ed0 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65  und. .    ** The
31ee0 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
31ef0 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
31f00 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
31f10 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
31f20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  to.    ** be dea
31f30 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
31f40 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
31f50 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
31f60 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
31f70 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61  t.    ** many ha
31f80 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c  ve not. The foll
31f90 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61  owing is a summa
31fa0 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry:.    **.    *
31fb0 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69  *   1) The entri
31fc0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
31fd0 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  th new sibling p
31fe0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
31ff0 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73  ot.    **      s
32000 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69  iblings when thi
32010 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
32020 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76  alled. These hav
32030 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  e already.    **
32040 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20        been set. 
32050 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  We don't need to
32060 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64   worry about old
32070 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
32080 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ere.    **      
32090 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
320a0 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65  e-list - the fre
320b0 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73  ePage() code has
320c0 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20   taken care.    
320d0 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
320e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
320f0 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72    2) The pointer
32100 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73  -map entries ass
32110 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
32120 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a   first overflow.
32130 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65      **      page
32140 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77   in any overflow
32150 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20   chains used by 
32160 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
32170 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a  s. These .    **
32180 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20        have also 
32190 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b  already been tak
321a0 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68  en care of by th
321b0 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63  e insertCell() c
321c0 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
321d0 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73  **   3) If the s
321e0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
321f0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
32200 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
32210 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20  s of.    **     
32220 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   cells stored on
32230 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32240 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  es may need to b
32250 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
32260 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66  *.    **   4) If
32270 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32280 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
32290 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
322a0 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a  , then any.    *
322b0 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20  *      overflow 
322c0 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68  pages used by th
322d0 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65  ese cells may ne
322e0 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
322f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e  .    **      (in
32300 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
32310 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  des never contai
32320 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76  n pointers to ov
32330 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20  erflow pages).. 
32340 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35     **.    **   5
32350 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
32360 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
32370 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
32380 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
32390 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20  **      entries 
323a0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68  for the right-ch
323b0 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63  ild pages of eac
323c0 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65  h sibling may ne
323d0 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  ed.    **      t
323e0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
323f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65    **.    ** Case
32400 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
32410 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
32420 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
32430 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
32440 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63  ock deals with c
32450 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64  ases 3 and 4 and
32460 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74   the one after t
32470 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e  hat, case 5. Sin
32480 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  ce.    ** settin
32490 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  g a pointer map 
324a0 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74  entry is a relat
324b0 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
324c0 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a  operation, this.
324d0 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79      ** code only
324e0 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61   sets pointer ma
324f0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
32500 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
32510 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
32520 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
32530 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61  moved between pa
32540 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ges.  */.    Mem
32550 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
32560 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61  ew[0];.    MemPa
32570 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
32580 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f  y[0];.    int nO
32590 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
325a0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
325b0 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f  nt iNextOld = pO
325c0 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65  ld->nCell + nOve
325d0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
325e0 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65  Overflow = (nOve
325f0 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f  rflow ? pOld->aO
32600 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29  vfl[0].idx : -1)
32610 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20  ;.    j = 0;    
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32630 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
32640 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e  ent 'old' siblin
32650 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20  g page */.    k 
32660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32680 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77   /* Current 'new
32690 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
326a0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
326b0 3c 6e 43 65 6c 6c 20 26 26 20 72 63 3d 3d 53 51  <nCell && rc==SQ
326c0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
326d0 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64       int isDivid
326e0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  er = 0;.      wh
326f0 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64  ile( i==iNextOld
32700 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
32710 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
32720 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
32730 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
32740 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20   cell on old.   
32750 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
32760 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73  page j. If the s
32770 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
32780 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
32790 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
327a0 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
327b0 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76  cell i was a div
327c0 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20  ider cell. */.  
327d0 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43        pOld = apC
327e0 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20  opy[++j];.      
327f0 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b    iNextOld = i +
32800 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
32810 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d  d->nCell + pOld-
32820 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
32830 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
32840 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
32850 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d       nOverflow =
32860 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
32870 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  ;.          iOve
32880 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61  rflow = i + !lea
32890 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f  fData + pOld->aO
328a0 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20  vfl[0].idx;.    
328b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73      }.        is
328c0 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44  Divider = !leafD
328d0 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  ata;  .      }..
328e0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
328f0 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65  erflow>0 || iOve
32900 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20  rflow<i );.     
32910 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
32920 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<2 || pOld->aOv
32930 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[0].idx==pOld-
32940 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29  >aOvfl[1].idx-1)
32950 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
32960 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f  Overflow<3 || pO
32970 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
32980 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d  ==pOld->aOvfl[2]
32990 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69  .idx-1);.      i
329a0 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20  f( i==iOverflow 
329b0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76  ){.        isDiv
329c0 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ider = 1;.      
329d0 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c    if( (--nOverfl
329e0 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ow)>0 ){.       
329f0 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a     iOverflow++;.
32a00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32a10 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  }..      if( i==
32a20 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20  cntNew[k] ){.   
32a30 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
32a40 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
32a50 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
32a60 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
32a70 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  n new.        **
32a80 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e   sibling page k.
32a90 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
32aa0 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
32ab0 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
32ac0 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
32ad0 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
32ae0 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  is a divider cel
32af0 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  l.  */.        p
32b00 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d  New = apNew[++k]
32b10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  ;.        if( !l
32b20 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e  eafData ) contin
32b30 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
32b40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32b50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
32b60 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20   assert( j<nOld 
32b70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32b80 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20   k<nNew );..    
32b90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
32ba0 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
32bb0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e  divider cell (an
32bc0 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72  d is not now) or
32bd0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65  .      ** an ove
32be0 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69  rflow cell, or i
32bf0 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c  f the cell was l
32c00 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66  ocated on a diff
32c10 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20  erent sibling.  
32c20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f      ** page befo
32c30 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  re the balancing
32c40 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
32c50 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er map entries a
32c60 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20  ssociated.      
32c70 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c  ** with any chil
32c80 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
32c90 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75  ges need to be u
32ca0 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  pdated.  */.    
32cb0 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20    if( isDivider 
32cc0 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70  || pOld->pgno!=p
32cd0 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
32ce0 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f       if( !leafCo
32cf0 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
32d00 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
32d10 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
32d20 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50  Cell[i]), PTRMAP
32d30 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
32d40 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
32d50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
32d60 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  szCell[i]>pNew->
32d70 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
32d80 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
32d90 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  vflPtr(pNew, apC
32da0 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  ell[i], &rc);.  
32db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32dc0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
32dd0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
32de0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
32df0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
32e00 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d         u32 key =
32e10 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77   get4byte(&apNew
32e20 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  [i]->aData[8]);.
32e30 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
32e40 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d  t(pBt, key, PTRM
32e50 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
32e60 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  i]->pgno, &rc);.
32e70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
32e80 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20  if 0.    /* The 
32e90 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32ea0 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65  () contains asse
32eb0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
32ec0 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74  that verify that
32ed0 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e  .    ** all poin
32ee0 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72  ter map pages ar
32ef0 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  e set correctly.
32f00 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c   This is helpful
32f10 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64   while .    ** d
32f20 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69  ebugging. This i
32f30 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c  s usually disabl
32f40 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72  ed because a cor
32f50 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61  rupt database ma
32f60 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61  y.    ** cause a
32f70 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
32f80 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a  ment to fail.  *
32f90 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  /.    ptrmapChec
32fa0 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e  kPages(apNew, nN
32fb0 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43  ew);.    ptrmapC
32fc0 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65  heckPages(&pPare
32fd0 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  nt, 1);.#endif. 
32fe0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
32ff0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
33000 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
33010 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c  CE: finished: ol
33020 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
33030 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
33040 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e     nOld, nNew, n
33050 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Cell));..  /*.  
33060 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
33070 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
33080 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
33090 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  p:.  sqlite3Scra
330a0 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
330b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
330c0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
330d0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
330e0 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
330f0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
33100 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
33110 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
33120 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
33130 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
33140 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
33150 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70   when the root p
33160 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20  age of a b-tree 
33170 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20  structure is.** 
33180 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e  overfull (has on
33190 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
331a0 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a  ow pages)..**.**
331b0 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   A new child pag
331c0 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  e is allocated a
331d0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
331e0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
331f0 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63  oot.** page, inc
33200 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  luding overflow 
33210 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65  cells, are copie
33220 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  d into the child
33230 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  . The root.** pa
33240 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77  ge is then overw
33250 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69  ritten to make i
33260 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  t an empty page 
33270 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63  with the right-c
33280 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  hild .** pointer
33290 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
332a0 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   new page..**.**
332b0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
332c0 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  g, all pointer-m
332d0 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
332e0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
332f0 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  s .** that the n
33300 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f  ew child-page no
33310 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  w contains point
33320 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74  ers to are updat
33330 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79  ed. The.** entry
33340 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
33350 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  o the new right-
33360 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
33370 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
33380 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  e is also update
33390 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
333a0 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64  essful, *ppChild
333b0 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61   is set to conta
333c0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
333d0 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20  o the child .** 
333e0 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  page and SQLITE_
333f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
33400 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33410 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69   caller is requi
33420 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72  red.** to call r
33430 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20  eleasePage() on 
33440 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79  *ppChild exactly
33450 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72   once. If an err
33460 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e  or occurs,.** an
33470 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
33480 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43  eturned and *ppC
33490 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30  hild is set to 0
334a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
334b0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
334c0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d  emPage *pRoot, M
334d0 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64  emPage **ppChild
334e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33500 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
33510 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
33520 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
33530 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b  age *pChild = 0;
33540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
33550 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
33560 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
33570 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
33580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33590 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
335a0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
335b0 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
335c0 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70   *pBt = pRoot->p
335d0 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54  Bt;    /* The BT
335e0 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ree */..  assert
335f0 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  ( pRoot->nOverfl
33600 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ow>0 );.  assert
33610 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
33620 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
33630 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70   );..  /* Make p
33640 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70  Root, the root p
33650 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
33660 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c  e, writable. All
33670 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a  ocate a new .  *
33680 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  * page that will
33690 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
336a0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
336b0 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63  Page. Copy the c
336c0 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
336d0 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  the node stored 
336e0 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68  on pRoot into th
336f0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
33700 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
33710 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33720 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
33730 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
33740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
33750 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
33760 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
33770 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
33780 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 69 66  >pgno,0);.    if
33790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
337a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f  ){.      rc = co
337b0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  pyNodeContent(pR
337c0 6f 6f 74 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20  oot, pChild);.  
337d0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
337e0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
337f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
33800 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50  gnoChild, PTRMAP
33810 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70  _BTREE, pRoot->p
33820 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
33830 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
33840 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70  f( rc ){.    *pp
33850 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72  Child = 0;.    r
33860 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
33870 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
33880 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
33890 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
338a0 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
338b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
338c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
338d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
338e0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
338f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ;.  assert( pChi
33900 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74  ld->nCell==pRoot
33910 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52  ->nCell );..  TR
33920 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
33930 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
33940 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70   %d\n", pRoot->p
33950 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
33960 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  o));..  /* Copy 
33970 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33980 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f  ls from pRoot to
33990 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d   pChild */.  mem
339a0 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
339b0 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c  l, pRoot->aOvfl,
339c0 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
339d0 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e  w*sizeof(pRoot->
339e0 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
339f0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
33a00 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  = pRoot->nOverfl
33a10 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ow;..  /* Zero t
33a20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
33a30 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61  Root. Then insta
33a40 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65  ll pChild as the
33a50 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f   right-child. */
33a60 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
33a70 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  t, pChild->aData
33a80 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
33a90 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52  ;.  put4byte(&pR
33aa0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
33ab0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
33ac0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a  pgnoChild);..  *
33ad0 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64  ppChild = pChild
33ae0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
33af0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
33b00 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75  he page that pCu
33b10 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
33b20 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62  ts to has just b
33b30 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a  een modified in.
33b40 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69  ** some way. Thi
33b50 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72  s function figur
33b60 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d  es out if this m
33b70 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e  odification mean
33b80 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65  s the.** tree ne
33b90 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
33ba0 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61  ed, and if so ca
33bb0 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69  lls the appropri
33bc0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a  ate balancing .*
33bd0 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e  * routine. Balan
33be0 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  cing routines ar
33bf0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e  e:.**.**   balan
33c00 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20  ce_quick().**   
33c10 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
33c20 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f  .**   balance_no
33c30 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69  nroot().*/.stati
33c40 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
33c50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
33c60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33c70 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  _OK;.  const int
33c80 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42   nMin = pCur->pB
33c90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20  t->usableSize * 
33ca0 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c  2 / 3;.  u8 aBal
33cb0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31  anceQuickSpace[1
33cc0 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  3];.  u8 *pFree 
33cd0 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59  = 0;..  TESTONLY
33ce0 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  ( int balance_qu
33cf0 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  ick_called = 0 )
33d00 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
33d10 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
33d20 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a  _called = 0 );..
33d30 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69    do {.    int i
33d40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
33d50 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ge;.    MemPage 
33d60 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
33d70 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20  pPage[iPage];.. 
33d80 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20     if( iPage==0 
33d90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
33da0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ge->nOverflow ){
33db0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
33dc0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
33dd0 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66   b-tree is overf
33de0 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
33df0 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20  e call the.     
33e00 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65     ** balance_de
33e10 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  eper() function 
33e20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
33e30 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f  child for the ro
33e40 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
33e50 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20  ** and copy the 
33e60 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
33e70 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
33e80 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20  e to it. The.   
33e90 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65       ** next ite
33ea0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
33eb0 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
33ec0 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  ce the child pag
33ed0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  e..        */ . 
33ee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
33ef0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
33f00 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
33f10 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
33f20 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
33f30 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
33f40 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
33f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33f60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
33f70 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  ->iPage = 1;.   
33f80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
33f90 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[0] = 0;.     
33fa0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
33fb0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
33fc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
33fd0 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65  >apPage[1]->nOve
33fe0 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20  rflow );.       
33ff0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
34000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
34010 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34020 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
34030 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
34040 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29  e->nFree<=nMin )
34050 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
34060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34070 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20  MemPage * const 
34080 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
34090 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b  apPage[iPage-1];
340a0 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
340b0 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69   iIdx = pCur->ai
340c0 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20  Idx[iPage-1];.. 
340d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
340e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
340f0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
34100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34110 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65  ITE_OK ){.#ifnde
34120 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
34130 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20  ICKBALANCE.     
34140 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
34150 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26  sData.         &
34160 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
34170 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26  ow==1.         &
34180 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  & pPage->aOvfl[0
34190 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
341a0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ell.         && 
341b0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
341c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
341d0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64  rent->nCell==iId
341e0 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  x.        ){.   
341f0 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62         /* Call b
34200 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74  alance_quick() t
34210 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
34220 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20  ibling of pPage 
34230 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  on which.       
34240 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74     ** to store t
34250 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
34260 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  . balance_quick(
34270 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20  ) inserts a new 
34280 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  cell.          *
34290 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20  * into pParent, 
342a0 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
342b0 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  pParent overflow
342c0 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20  . If this.      
342d0 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
342e0 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74  the next interat
342f0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
34300 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
34310 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20  pParent .       
34320 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72     ** use either
34330 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34340 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65  () or balance_de
34350 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68  eper(). Until th
34360 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
34370 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65  happens, the ove
34380 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74  rflow cell is st
34390 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c  ored in the aBal
343a0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
343b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
343c0 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20  ffer. .         
343d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
343e0 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
343f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
34400 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65  sert() is to che
34410 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20  ck that only a. 
34420 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
34430 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  le call to balan
34440 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61  ce_quick() is ma
34450 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  de for each call
34460 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20   to this.       
34470 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
34480 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
34490 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62   verified, a sub
344a0 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e  tle bug involvin
344b0 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20  g reuse.        
344c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c    ** of the aBal
344d0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
344e0 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e   might sneak in.
344f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
34500 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34510 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63  (balance_quick_c
34520 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
34530 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
34540 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72  lance_quick(pPar
34550 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c  ent, pPage, aBal
34560 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b  anceQuickSpace);
34570 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
34580 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
34590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
345a0 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20  this case, call 
345b0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
345c0 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  ) to redistribut
345d0 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  e cells.        
345e0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61    ** between pPa
345f0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f  ge and up to 2 o
34600 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61  f its sibling pa
34610 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ges. This involv
34620 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
34630 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
34640 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e  ntents of pParen
34650 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
34660 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20  se pParent to.  
34670 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d          ** becom
34680 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
34690 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78  derfull. The nex
346a0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
346b0 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20  he do-loop.     
346c0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c       ** will bal
346d0 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
346e0 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20  page to correct 
346f0 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20  this..          
34700 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
34710 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   If the parent p
34720 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
34730 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c  full, the overfl
34740 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73  ow cell or cells
34750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
34760 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
34770 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c  pSpace buffer al
34780 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74  located immediat
34790 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20  ely below. .    
347a0 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65        ** A subse
347b0 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  quent iteration 
347c0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
347d0 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68  ill deal with th
347e0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  is by.          
347f0 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e  ** calling balan
34800 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61  ce_nonroot() (ba
34810 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d  lance_deeper() m
34820 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ay be called fir
34830 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
34840 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20   but it doesn't 
34850 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c  deal with overfl
34860 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20  ow cells - just 
34870 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a  moves them to a.
34880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
34890 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e  ferent page). On
348a0 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65  ce this subseque
348b0 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  nt call to balan
348c0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20  ce_nonroot() .  
348d0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63          ** has c
348e0 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20  ompleted, it is 
348f0 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20  safe to release 
34900 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
34910 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20  r used by.      
34920 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69      ** the previ
34930 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  ous call, as the
34940 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64   overflow cell d
34950 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ata will have be
34960 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  en .          **
34970 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69   copied either i
34980 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
34990 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
349a0 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  or into the new.
349b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70            ** pSp
349c0 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65  ace buffer passe
349d0 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20  d to the latter 
349e0 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
349f0 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20  nonroot()..     
34a00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34a10 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73    u8 *pSpace = s
34a20 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
34a30 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  (pCur->pBt->page
34a40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
34a50 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
34a60 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69  nroot(pParent, i
34a70 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61  Idx, pSpace, iPa
34a80 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20  ge==1);.        
34a90 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
34aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
34ab0 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55   pFree is not NU
34ac0 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
34ad0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
34ae0 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  er used .       
34af0 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65       ** by a pre
34b00 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61  vious call to ba
34b10 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
34b20 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72   Its contents ar
34b30 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
34b40 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68   now stored eith
34b50 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62  er on real datab
34b60 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74  ase pages or wit
34b70 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20  hin the .       
34b80 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61       ** new pSpa
34b90 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74  ce buffer, so it
34ba0 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66   may be safely f
34bb0 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  reed here. */.  
34bc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34bd0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
34be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
34bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
34c00 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69  pSpace buffer wi
34c10 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ll be freed afte
34c20 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  r the next call 
34c30 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
34c40 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34c50 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
34c60 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
34c70 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
34c80 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
34c90 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a  comes first. */.
34ca0 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
34cb0 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  = pSpace;.      
34cc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
34cd0 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
34ce0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  low = 0;..      
34cf0 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  /* The next iter
34d00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
34d10 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68  loop balances th
34d20 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a  e parent page. *
34d30 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
34d40 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
34d50 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
34d60 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
34d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34d80 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  ;..  if( pFree )
34d90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
34da0 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  eFree(pFree);.  
34db0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  .../*.** Insert 
34dd0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
34de0 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
34df0 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
34e00 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
34e10 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
34e20 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
34e30 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
34e40 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
34e50 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
34e60 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
34e70 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
34e80 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
34e90 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
34ea0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
34eb0 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
34ec0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
34ed0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
34ee0 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
34ef0 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
34f00 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
34f10 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
34f20 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
34f30 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
34f40 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
34f50 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
34f60 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
34f70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
34f80 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
34f90 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
34fa0 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63  o.** MovetoUnpac
34fb0 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75  ked() to seek cu
34fc0 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b  rsor pCur to (pK
34fd0 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c  ey, nKey) has al
34fe0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65  ready.** been pe
34ff0 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73  rformed. seekRes
35000 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63  ult is the searc
35010 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  h result returne
35020 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a  d (a negative.**
35030 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20   number if pCur 
35040 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74  points at an ent
35050 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ry that is small
35060 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e  er than (pKey, n
35070 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f  Key), or.** a po
35080 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
35090 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
350a0 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c  n etry that is l
350b0 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28  arger than .** (
350c0 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a  pKey, nKey)). .*
350d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
350e0 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
350f0 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73   is 0, then curs
35100 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e  or pCur may poin
35110 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74  t to any .** ent
35120 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72  ry or to no entr
35130 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69  y at all. In thi
35140 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
35150 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b  tion has to seek
35160 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62  .** the cursor b
35170 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65  efore the new ke
35180 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65  y can be inserte
35190 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
351a0 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
351b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
351c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
351d0 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
351e0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
351f0 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
35200 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
35210 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
35220 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
35230 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
35240 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
35250 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
35260 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
35270 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
35280 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
35290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
352b0 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
352c0 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
352d0 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
352e0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ias,            
352f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
35300 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
35310 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
35320 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20   seekResult     
35330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
35340 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d  esult of prior M
35350 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
35360 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  call */.){.  int
35370 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d   rc;.  int loc =
35380 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69   seekResult;.  i
35390 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20  nt szNew;.  int 
353a0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
353b0 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
353c0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
353d0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
353e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
353f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
35400 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
35410 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
35420 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   0;..  if( pCur-
35430 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
35440 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73  FAULT ){.    ass
35450 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
35460 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
35470 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  ;.    return pCu
35480 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
35490 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
354a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
354b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
354c0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
354d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
354e0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
354f0 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
35500 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  y );.  assert( h
35510 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
35520 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e  leLock(p, pCur->
35530 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e  pgnoRoot, pCur->
35540 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20  pKeyInfo!=0, 2) 
35550 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
35560 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
35570 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73 74  has been consist
35580 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75 72  ent. If this cur
35590 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a 20  sor was opened. 
355a0 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61 6e   ** expecting an
355b0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 74   index b-tree, t
355c0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73  hen the caller s
355d0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
355e0 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79  ng blob.  ** key
355f0 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63 69  s with no associ
35600 61 74 65 64 20 64 61 74 61 2e 20 49 66 20 74 68  ated data. If th
35610 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
35620 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20 61 6e  ned expecting an
35630 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  .  ** intkey tab
35640 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  le, the caller s
35650 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
35660 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  ng integer keys 
35670 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62  with a.  ** blob
35680 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 64   of associated d
35690 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ata.  */.  asser
356a0 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70  t( (pKey==0)==(p
356b0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
356c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
356d0 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20  is is an insert 
356e0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
356f0 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  ree, invalidate 
35700 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20  any incrblob .  
35710 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
35720 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  on the row being
35730 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d   replaced (assum
35740 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65  ing this is a re
35750 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61  place.  ** opera
35760 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20  tion - if it is 
35770 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  not, the followi
35780 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20  ng is a no-op). 
35790 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
357a0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
357b0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
357c0 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
357d0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
357e0 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
357f0 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
35800 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
35810 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
35820 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
35830 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
35840 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
35850 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f  l to btreeMoveto
35860 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f  () below is a no
35870 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78  -op. For.  ** ex
35880 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65  ample, when inse
35890 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20  rting data into 
358a0 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74  a table with aut
358b0 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65  o-generated inte
358c0 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74  ger.  ** keys, t
358d0 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e  he VDBE layer in
358e0 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72  vokes sqlite3Btr
358f0 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75  eeLast() to figu
35900 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a  re out the .  **
35910 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20   integer key to 
35920 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c  use. It then cal
35930 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
35940 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73   to actually ins
35950 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ert the .  ** da
35960 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b  ta into the intk
35970 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  ey B-Tree. In th
35980 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76  is case btreeMov
35990 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
359a0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
359b0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
359c0 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
359d0 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
359e0 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
359f0 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
35a00 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
35a10 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
35a20 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
35a30 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
35a40 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
35a50 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
35a60 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
35a70 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
35a80 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b  pgnoRoot, pCur);
35a90 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
35aa0 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f  rn rc;.  if( !lo
35ab0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  c ){.    rc = bt
35ac0 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
35ad0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
35ae0 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20  ndBias, &loc);. 
35af0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
35b00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
35b10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
35b20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
35b30 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65  || (pCur->eState
35b40 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
35b50 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70   && loc) );..  p
35b60 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
35b70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
35b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35b90 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
35ba0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
35bb0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
35bc0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
35bd0 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49 4e  );..  TRACE(("IN
35be0 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
35bf0 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
35c00 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
35c10 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
35c20 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
35c30 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
35c40 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
35c50 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
35c60 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
35c70 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
35c80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
35c90 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
35ca0 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43  ace(pBt);.  newC
35cb0 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
35cc0 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43  pace;.  if( newC
35cd0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
35ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
35cf0 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
35d00 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20  pPage, newCell, 
35d10 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74  pKey, nKey, pDat
35d20 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c  a, nData, nZero,
35d30 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
35d40 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
35d50 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
35d60 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
35d70 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
35d80 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35d90 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
35da0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64  IZE(pBt) );.  id
35db0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
35dc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
35dd0 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20  if( loc==0 ){.  
35de0 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
35df0 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
35e00 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
35e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35e20 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
35e30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
35e40 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
35e50 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
35e60 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
35e70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
35e80 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  , idx);.    if( 
35e90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
35ea0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
35eb0 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
35ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
35ed0 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
35ee0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
35ef0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
35f00 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
35f10 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43 65  ell);.    dropCe
35f20 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
35f30 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  zOld, &rc);.    
35f40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
35f50 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  d_insert;.  }els
35f60 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
35f70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
35f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35f90 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
35fa0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
35fb0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
35fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
35fd0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
35fe0 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65  af );.  }.  inse
35ff0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
36000 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
36010 77 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20  w, 0, 0, &rc);. 
36020 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36030 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
36040 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
36050 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
36060 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
36070 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
36080 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
36090 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
360a0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
360b0 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
360c0 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
360d0 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
360e0 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
360f0 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
36100 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
36110 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
36120 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
36130 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
36140 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
36150 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
36160 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
36170 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
36180 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
36190 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
361a0 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
361b0 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
361c0 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
361d0 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
361e0 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
361f0 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
36200 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
36210 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
36220 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
36230 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
36240 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
36250 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
36260 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
36270 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
36280 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
36290 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
362a0 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
362b0 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
362c0 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
362d0 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
362e0 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
362f0 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
36300 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
36310 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
36320 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
36330 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
36340 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
36350 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
36360 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
36370 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
36380 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
36390 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
363a0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
363b0 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
363c0 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
363d0 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
363e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
363f0 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
36400 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
36410 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
36420 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
36430 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
36440 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
36450 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
36460 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
36470 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
36480 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
36490 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
364a0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
364b0 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
364c0 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
364d0 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
364e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
364f0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
36500 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
36510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36520 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36530 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
36540 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
36550 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
36560 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
36570 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
36580 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
36590 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
365a0 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
365b0 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
365c0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
365d0 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
365e0 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
365f0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
36600 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
36610 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
36620 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
36630 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
36640 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
36650 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
36660 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
36670 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
36680 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
36690 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
366a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
366b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
366c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
366d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
366e0 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
366f0 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73  w==0 );..end_ins
36700 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
36710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
36720 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
36730 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
36740 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
36750 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
36760 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
36770 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
36780 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
36790 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
367a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
367b0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
367c0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
367d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
367e0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
367f0 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20    .  int rc;    
36800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
36820 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
36830 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
36840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36850 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65     /* Page to de
36860 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a  lete cell from *
36870 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
36880 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  r *pCell;       
36890 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
368a0 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64  ter to cell to d
368b0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
368c0 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20  CellIdx;        
368d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
368f0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
36900 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20  int iCellDepth; 
36910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36920 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66       /* Depth of
36930 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67   node containing
36940 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73   pCell */ ..  as
36950 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
36960 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
36970 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
36980 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
36990 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
369a0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
369b0 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
369c0 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
369d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  );.  assert( has
369e0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
369f0 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67  Lock(p, pCur->pg
36a00 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b  noRoot, pCur->pK
36a10 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b  eyInfo!=0, 2) );
36a20 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52  .  assert( !hasR
36a30 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
36a40 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20  pCur->pgnoRoot) 
36a50 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
36a60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
36a70 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
36a80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
36a90 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20  ge]->nCell) .   
36aa0 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  || NEVER(pCur->e
36ab0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
36ac0 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  LID).  ){.    re
36ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
36ae0 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  R;  /* Something
36af0 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20   has gone awry. 
36b00 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  */.  }..  /* If 
36b10 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
36b20 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65   operation to re
36b30 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  move a row from 
36b40 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a  a table b-tree,.
36b50 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20    ** invalidate 
36b60 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
36b70 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
36b80 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
36b90 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  ed.  */.  if( pC
36ba0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
36bb0 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
36bc0 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
36bd0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
36be0 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ot, pCur->info.n
36bf0 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
36c00 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75  iCellDepth = pCu
36c10 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c  r->iPage;.  iCel
36c20 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  lIdx = pCur->aiI
36c30 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  dx[iCellDepth];.
36c40 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
36c50 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
36c60 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  h];.  pCell = fi
36c70 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
36c80 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49  ellIdx);..  /* I
36c90 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
36ca0 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
36cb0 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
36cc0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f   a leaf page, mo
36cd0 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
36ce0 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  or to the larges
36cf0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
36d00 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ree that is smal
36d10 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68  ler than.  ** th
36d20 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65  e entry being de
36d30 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c  leted. This cell
36d40 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68   will replace th
36d50 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  e cell being del
36d60 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  eted.  ** from t
36d70 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
36d80 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27  . The 'previous'
36d90 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66   entry is used f
36da0 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a  or this instead.
36db0 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78    ** of the 'nex
36dc0 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65  t' entry, as the
36dd0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
36de0 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74  is always a part
36df0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   of the.  ** sub
36e00 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20  -tree headed by 
36e10 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f  the child page o
36e20 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  f the cell being
36e30 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d   deleted. This m
36e40 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63  akes.  ** balanc
36e50 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c  ing the tree fol
36e60 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74  lowing the delet
36e70 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69  e operation easi
36e80 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  er.  */.  if( !p
36e90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
36ea0 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
36eb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
36ec0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
36ed0 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
36ee0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36ef0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
36f00 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
36f10 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
36f20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
36f30 74 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f 72  this table befor
36f40 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e  e.  ** making an
36f50 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e  y modifications.
36f60 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20 63   Make the page c
36f70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
36f80 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  try to be .  ** 
36f90 64 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c 65  deleted writable
36fa0 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79 20  . Then free any 
36fb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
36fc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
36fd0 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61  he .  ** entry a
36fe0 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76  nd finally remov
36ff0 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  e the cell itsel
37000 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  f from within th
37010 65 20 70 61 67 65 2e 20 20 0a 20 20 2a 2f 0a 20  e page.  .  */. 
37020 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
37030 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
37040 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b  pgnoRoot, pCur);
37050 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
37060 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
37070 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37080 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
37090 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
370a0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 63 6c  rn rc;.  rc = cl
370b0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
370c0 43 65 6c 6c 29 3b 0a 20 20 64 72 6f 70 43 65 6c  Cell);.  dropCel
370d0 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
370e0 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
370f0 50 61 67 65 2c 20 70 43 65 6c 6c 29 2c 20 26 72  Page, pCell), &r
37100 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
37110 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
37120 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65  If the cell dele
37130 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61  ted was not loca
37140 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61  ted on a leaf pa
37150 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
37160 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72 72  sor.  ** is curr
37170 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
37180 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
37190 74 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d 74  try in the sub-t
371a0 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a 20  ree headed.  ** 
371b0 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61 67  by the child-pag
371c0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  e of the cell th
371d0 61 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c 65  at was just dele
371e0 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65  ted from an inte
371f0 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20  rnal.  ** node. 
37200 54 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  The cell from th
37210 65 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65 64  e leaf node need
37220 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f  s to be moved to
37230 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
37240 2a 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61  ** node to repla
37250 63 65 20 74 68 65 20 64 65 6c 65 74 65 64 20 63  ce the deleted c
37260 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ell.  */.  if( !
37270 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37280 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61     MemPage *pLea
37290 66 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  f = pCur->apPage
372a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
372b0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
372c0 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d    Pgno n = pCur-
372d0 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
372e0 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  th+1]->pgno;.   
372f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
37300 70 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c  pTmp;..    pCell
37310 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
37320 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d  f, pLeaf->nCell-
37330 31 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  1);.    nCell = 
37340 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61  cellSizePtr(pLea
37350 66 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61  f, pCell);.    a
37360 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
37370 49 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20  IZE(pBt)>=nCell 
37380 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65  );..    allocate
37390 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
373a0 20 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e      pTmp = pBt->
373b0 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20 20  pTmpSpace;..    
373c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
373d0 72 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70 44  rWrite(pLeaf->pD
373e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 6e 73 65  bPage);.    inse
373f0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  rtCell(pPage, iC
37400 65 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c  ellIdx, pCell-4,
37410 20 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20   nCell+4, pTmp, 
37420 6e 2c 20 26 72 63 29 3b 0a 20 20 20 20 64 72 6f  n, &rc);.    dro
37430 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  pCell(pLeaf, pLe
37440 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65  af->nCell-1, nCe
37450 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  ll, &rc);.    if
37460 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37470 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61  ;.  }..  /* Bala
37480 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66  nce the tree. If
37490 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
374a0 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ed was located o
374b0 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20  n a leaf page,. 
374c0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72   ** then the cur
374d0 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  sor still points
374e0 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49   to that page. I
374f0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
37500 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  first.  ** call 
37510 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70  to balance() rep
37520 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61  airs the tree, a
37530 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63  nd the if(...) c
37540 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  ondition is.  **
37550 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a   never true..  *
37560 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  *.  ** Otherwise
37570 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64  , if the entry d
37580 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e  eleted was on an
37590 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70   internal node p
375a0 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70  age, then.  ** p
375b0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
375c0 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
375d0 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65   from which a ce
375e0 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74  ll was removed t
375f0 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74  o.  ** replace t
37600 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20  he cell deleted 
37610 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
37620 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  l node. This is 
37630 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72  slightly.  ** tr
37640 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66  icky as the leaf
37650 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64   node may be und
37660 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20  erfull, and the 
37670 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61  internal node ma
37680 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72  y.  ** be either
37690 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75   under or overfu
376a0 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
376b0 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69   run the balanci
376c0 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a  ng algorithm.  *
376d0 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f  * on the leaf no
376e0 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65  de first. If the
376f0 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64   balance proceed
37700 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20  s far enough up 
37710 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68  the.  ** tree th
37720 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72  at we can be sur
37730 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c  e that any probl
37740 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e  em in the intern
37750 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a  al node has.  **
37760 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c   been corrected,
37770 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72   so be it. Other
37780 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61  wise, after bala
37790 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e  ncing the leaf n
377a0 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74  ode,.  ** walk t
377b0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65  he cursor up the
377c0 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74   tree to the int
377d0 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62  ernal node and b
377e0 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20  alance it as .  
377f0 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72  ** well.  */.  r
37800 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
37810 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
37820 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e  ITE_OK && pCur->
37830 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
37840 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
37850 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
37860 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72  Depth ){.      r
37870 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
37880 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
37890 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20  age--]);.    }. 
378a0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
378b0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
378c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
378d0 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
378e0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
378f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37900 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
37910 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
37920 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
37930 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
37940 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
37950 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
37960 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
37970 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
37980 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
37990 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
379a0 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
379b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
379c0 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
379d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
379e0 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
379f0 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
37a00 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
37a10 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
37a20 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
37a30 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
37a40 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
37a50 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
37a60 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
37a70 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
37a80 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
37a90 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
37aa0 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74  c int btreeCreat
37ab0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
37ac0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
37ad0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
37ae0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
37af0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
37b00 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
37b10 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
37b20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
37b30 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
37b40 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
37b50 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
37b60 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
37b70 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
37b80 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
37b90 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
37ba0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37bb0 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  M.  rc = allocat
37bc0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
37bd0 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
37be0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  t, 1, 0);.  if( 
37bf0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
37c00 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20   rc;.  }.#else. 
37c10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
37c20 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
37c30 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20   pgnoMove;      
37c40 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68  /* Move a page h
37c50 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  ere to make room
37c60 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
37c70 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  ge */.    MemPag
37c80 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a  e *pPageMove; /*
37c90 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76   The page to mov
37ca0 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e to. */..    /*
37cb0 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   Creating a new 
37cc0 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62  table may probab
37cd0 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ly require movin
37ce0 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61  g an existing da
37cf0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f  tabase.    ** to
37d00 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
37d10 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f  he new tables ro
37d20 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65  ot page. In case
37d30 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73   this page turns
37d40 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  .    ** out to b
37d50 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
37d60 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f  ge, delete all o
37d70 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70  verflow page-map
37d80 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68   caches.    ** h
37d90 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73  eld by open curs
37da0 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ors..    */.    
37db0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
37dc0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
37dd0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
37de0 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
37df0 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
37e00 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
37e10 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
37e20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
37e30 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
37e40 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
37e50 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
37e60 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
37e70 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
37e80 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
37e90 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page is (meta[3
37ea0 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ]+1)..    */.   
37eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
37ec0 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41  Meta(p, BTREE_LA
37ed0 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c  RGEST_ROOT_PAGE,
37ee0 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
37ef0 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
37f00 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
37f10 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
37f20 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
37f30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
37f40 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
37f50 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
37f60 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
37f70 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
37f80 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
37f90 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
37fa0 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
37fb0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37fc0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
37fd0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
37fe0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37ff0 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
38000 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
38010 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
38020 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
38030 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
38040 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
38050 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
38060 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
38070 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
38080 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
38090 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
380a0 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
380b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
380c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
380d0 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
380e0 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
380f0 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
38100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38110 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
38120 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
38130 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
38140 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
38150 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
38160 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
38170 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
38180 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
38190 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
381a0 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
381b0 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
381c0 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
381d0 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
381e0 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
381f0 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
38200 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
38210 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
38220 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
38230 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
38240 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
38250 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
38260 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
38270 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
38280 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
38290 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
382a0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
382b0 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
382c0 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
382d0 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
382e0 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
382f0 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
38300 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
38310 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
38320 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
38330 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
38340 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
38350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
38370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
38380 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
38390 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
383a0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
383b0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
383c0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
383d0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
383e0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
383f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
38400 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
38410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
38420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38430 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
38440 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
38450 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
38460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38470 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
38480 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
38490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
384a0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMA